[Haskell-beginners] Thread Blocking

Eugene Perederey eugene.perederey at gmail.com
Tue Sep 4 21:27:29 CEST 2012


I added a few prints to your code

fun m = do
  putStrLn "fun1"
  putMVar m 10
  putStrLn "fun2"


main = do
  m <- newEmptyMVar
  forkIO $ fun m
  putStrLn "main1"
  putMVar m 10
  putStrLn "main2"

It works 50/50 for me in Mac OS X 10.6.8.

On 4 September 2012 12:16, mukesh tiwari <mukeshtiwari.iiitm at gmail.com> wrote:
> Hi Eugene
> Thank you for reply.
>
> On Wed, Sep 5, 2012 at 12:32 AM, Eugene Perederey
> <eugene.perederey at gmail.com> wrote:
>>
>> Why do you think main should block more than once?
>> I see only two possible scenarios: the fun thread puts to mvar first
>> thus blocking main,
>
>
> So at least in this case I should get thread blocked indefinitely in an MVar
> operation
>
>>
>> or 10 is put into mvar in main, blocking the other thread indefinitely.
>
>
> or main will execute and fun thread will die. There are 50 - 50 chance for
> this ( assuming both are equally likely ). I did some modification in my
> code and Now I am  consistently getting "Concurrent: thread blocked
> indefinitely in an MVar operation"
>
>
> import Data.List
> import Control.Concurrent
>
> fun m = do
>    putMVar m 10
>    return ()
>
>
> main = do
>   m <- newEmptyMVar
>   forkIO $ fun m
>   putStrLn "I am inside main"
>
>   putMVar m 10
>   return ()
>
> [mukesh.tiwari@ Programming]$ ghc-7.4.1 -threaded -fforce-recomp
> Concurrent.hs
> [1 of 1] Compiling Main             ( Concurrent.hs, Concurrent.o )
> Linking Concurrent ...
> [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
> I am inside main
> Concurrent: thread blocked indefinitely in an MVar operation
>
> [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
> I am inside main
> Concurrent: thread blocked indefinitely in an MVar operation
>
> [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
> I am inside main
> Concurrent: thread blocked indefinitely in an MVar operation
>
> [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
> I am inside main
> Concurrent: thread blocked indefinitely in an MVar operation
>
> [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
> I am inside main
> Concurrent: thread blocked indefinitely in an MVar operation
>
> My question is why the outcome in first case is deterministic. Every time
> the code executing  ( at least half the time main thread should be blocked )
> .
>
> Regards
> Mukesh Tiwari
>
>>
>>
>> On 4 September 2012 11:54, mukesh tiwari <mukeshtiwari.iiitm at gmail.com>
>> wrote:
>> > Hello All
>> > I was going trough Real World Haskell and it says "If we try to put a
>> > value
>> > into an MVar that is already full, our thread is put to sleep until
>> > another
>> > thread takes the value out". I wrote a simple code to block main
>> >
>> > import Data.List
>> > import Control.Concurrent
>> >
>> > fun m = do
>> >    putMVar m 10
>> >    return ()
>> >
>> >
>> > main = do
>> >   m <- newEmptyMVar
>> >   forkIO $ fun m
>> >   putMVar m 10
>> >   return ()
>> >
>> > What I am expecting that main should be blocked at least couple of times
>> > but its behaving more deterministically.
>> > [mukesh.tiwari@ Programming]$ ghc-7.4.1 -threaded -fforce-recomp
>> > Concurrent.hs
>> > [1 of 1] Compiling Main             ( Concurrent.hs, Concurrent.o )
>> > Linking Concurrent ...
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$ ./Concurrent  +RTS -N2
>> > [mukesh.tiwari@ Programming]$
>> >
>> > I am expecting to get thread blocked indefinitely on MVar at least half
>> > the
>> > time. Could some one please tell me why this deterministic behavior ?
>> > Regards
>> > Mukesh Tiwari
>> >
>> >
>> > _______________________________________________
>> > Beginners mailing list
>> > Beginners at haskell.org
>> > http://www.haskell.org/mailman/listinfo/beginners
>> >
>>
>>
>>
>> --
>> Best,
>> Eugene Perederey
>
>



-- 
Best,
Eugene Perederey



More information about the Beginners mailing list