[Haskell-cafe] Re: [Haskell] IVar
Simon Marlow
simonmarhaskell at gmail.com
Thu Dec 6 04:04:01 EST 2007
Jan-Willem Maessen wrote:
>
> On Dec 5, 2007, at 3:58 AM, Simon Marlow wrote:
>
>> Ah, so I was thinking of the following readIVar:
>>
>> readIVar = unsafePerformIO . readIVarIO
>>
>> But clearly there's a better one. Fair enough.
>
> Hmm, so unsafePerformIO doesn't deal with any operation that blocks?
Well, operations that block inside unsafePerformIO do block the whole
thread, yes, and that may lead to a deadlock if the blocking operation is
waiting to be unblocked by its own thread. It sounds like you want to back
off from any earlier-than-necessary evaluation at this point. Fortunately
this problem doesn't arise, because GHC won't commute evaluation past an IO
operation.
> I'm wondering about related sorts of examples now, as well:
>
> do
> x <- newIVar
> y <- unsafeInterleaveIO (readIVarIO x)
> writeIVar x 3
> print y
>
> Or the equivalent things to the above with MVars.
Yes, this suffers from the same problem. If the compiler were to eagerly
evaluate y, then you'll get deadlock.
Cheers,
Simon
More information about the Haskell-Cafe
mailing list