2010-06-05 12 views
23

Haskell'de IO gerçekleştiren iki iş parçacığım var. (Sadece yazdırırlar). aşağıdaki gibi bir şey: Aşağıdaki gibiHaskell'in atomik IO gerçekleştirmesini sağlayabilir miyim?

thread1 :: IO() 
thread1 = putStrLn "One" 

thread2 :: IO() 
thread2 = putStrLn "Two" 

Şu anda alıyorum sonuçları:

OnTwoe 
OTnweo 

Nasıl her iş parçacığı atomik onun IO tamamlar emin olabiliriz?

cevap

23

Bu iyi bir soru. Kaynağa atomik erişim sağlamak için bir senkronizasyon değişkeni kullanın.

thread1 lock = do 
     withMVar lock $ \_ -> putStrLn "foo" 

thread2 lock = do 
     withMVar lock $ \_ -> putStrLn "bar" 

alternatif bir tasarım hepsini yerine özel bir iş parçacığı sahip olmaktır: Her iplik kilit alır serpiştirmesine olmadan IO yapmak, Şimdi

main = do 
    lock <- newMVar() 
    forkIO $ ... lock 
    forkIO $ ... lock 

: basit bir yolu Mvar ile putStrLns ve bir Chan üzerinden yazdırmak için mesajlar gönderin.

+4

Bir alıştırma olarak: kaynağa erişim siparişi vermek için bunu işlem belleğini kullanarak yazmayı deneyin. –

+2

Bunu bir şans vereceğim! ayrıca değiştirdim: withMVar lock $ (\ _ -> putStrLn "bar") – Toymakerii

+1

Bu tasarımı kullanmadım ama sonunda bahsettiğiniz alternatif tasarım birkaç projede benim için gayet iyi çalıştı. –