Мой код, кажется, висит на readMVar
после того, как другой поток вызывает putMVar
. Я бы не ожидал, что это произойдет, но это то, что я наблюдаю. Мой основной поток создает два новых потока, каждый из которых имеет доступ к общему MVar
м.
Тема 1:
do
putStrLn "tick"
x <- readMVar m
putStrLn "tock"
Тема 2:
do
putMVar m 0
putStrLn "put m0"
void $ tryTakeMVar m
putStrLn "take m"
putMVar m 1
putStrLn "put m1"
Main:
do
m <- newEmptyMVar
<start thread 1>
<start thread 2>
В следующем случае моя программа зависает:
Два потока имеют доступ к общему MVar m
, который изначально пуст. Блоки 1 нити на readMVar m
. Тем временем поток 2 вызывает putMVar m ...
. На этом этапе поток 1 может продолжаться , но давайте предположим, что это не так. Затем поток 2 вызывает tryTakeMVar m
, который, по-видимому, опустошает полный MVar
. Затем поток 2 снова вызывает putMVar m ...
. Этот сценарий соответствует следующему выводу:
tick
put m0
take m
put m1
<hang>
Что здесь происходит? Я ожидаю, что «tock» должен напечатать, так как поток 2 заполнил MVar, но моя программа просто зависает.