2012-11-25 143 views
29

我知道如果我有多個線程調用putStrLn沒有任何種類的併發控制線程的輸出可能交錯。putStrLn線程安全嗎?

我的問題是putStrLn是否是線程安全模這個交錯輸出?

我假設putStrLn是一個緩衝寫操作,所以我真的問是否有兩個線程同時調用putStrLn輸出緩衝區的任何損壞。

一般來說,關於Haskell(真的是GHC)的其他「標準I/O」函數的線程安全性可以說些什麼呢?特別是,對於任何緩衝讀取操作,是否可以將同一個字符返回到兩個不同的線程,以便同時進行相同的讀取調用?

+0

我不認爲我聽說過一個庫的stdout輸出不是線程安全的(我正在考慮通常的C/C++運行時,C#,Java等),所以如果我必須猜一猜,我會說在這裏也可以。 +1好問題。 – Mehrdad

+0

在Linux上'putStrLn'和朋友通過['write'](http://linux.die.net/man/2/write)和['select'](http://linux.die.net/man/2/select)耦合爲一個固定長度的塊(當使用行緩存或塊緩存時),所以問題是'write'是否是線程安全的。 POSIX需要'寫入'(1003.1-2001:2.9.1和2.9.7)的線程安全性,通常情況是這樣。 – JJJ

+0

和''futex'](http://linux.die.net/man/4/futex)實現'MVar'鎖定(當使用'線程'運行時)。所以@shachaf的答案是正確的。 – JJJ

回答

28

是的,它在您詢問的意義上是線程安全的。 A HandleMVar的保護,它不允許緩衝區被損壞。正如你指出的那樣,交錯是另一回事。