[Haskell-cafe] Re: Asynchronous exception wormholes kill modularity

Andy Stewart lazycat.manatee at gmail.com
Mon Mar 29 07:17:58 EDT 2010


Simon Marlow <marlowsd at gmail.com> writes:

> On 26/03/2010 19:51, Isaac Dupree wrote:
>> On 03/25/10 12:36, Simon Marlow wrote:
>>> I'd also be amenable to having block/unblock count nesting levels
>>> instead, I don't think it would be too hard to implement and it wouldn't
>>> require any changes at the library level.
>>
>> Wasn't there a reason that it didn't nest?
>>
>> I think it was that operations that block-as-in-takeMVar, for an
>> unbounded length of time, are always supposed to C.Exception.unblock and
>> in fact be unblocked within that operation. Otherwise the thread might
>> never receive its asynchronous exceptions.
>
> That's why we have the notion of "interruptible operations": any operation that blocks for an
> unbounded amount of time is treated as interruptible and can receive asynchronous exceptions.
>
> I think of "block" as a way to turn asynchronous exceptions into synchronous ones.  So rather that
> having to worry that an asynchronous exception may strike at any point, you only have to worry about
> them being throw by blocking operations.  If in doubt you should think of every library function as
> potentially interruptible, but that still means you usually have enough control over asynchronous
> exceptions to avoid problems.
>
> If things get really hairy, consider using STM instead.  In STM an asynchronous exception causes a
> rollback, so maintaining your invariants is trivial - this is arguably one of the main benefits of
> STM.  There's no need for block/unblock within STM transactions.
Hi Isaac,

Yep, like Simon said, use STM instead.

STM will build thread-log for every TVar, in normal, every thread just
execute STM code, and don't care other threads state, current thread will
check thread-log when TVar need write, if okay, it will write value,
if have conflict with other threads, current action will rollback and
re-execute.

And STM's usage is simple enough, so i recommend use STM fix your
problem.

Cheers,

  -- Andy



More information about the Haskell-Cafe mailing list