2012-11-25 15 views
29

複数のスレッドがputStrLnを呼び出していて、スレッドの出力がインターリーブされる可能性のある並行性制御がない場合、私は知っています。putStrLnはスレッドセーフですか?

私の質問は、putStrLnがこのインターリーブされた出力をモジュロでスレッドセーフかどうかです。

putStrLnはバッファリングされた書き込み操作であると仮定していますので、2つのスレッドで同時にputStrLnを呼び出すと、出力バッファの破損が発生する可能性があります。

一般に、Haskellの(実際にはGHCの)他の「標準I/O」関数のスレッド安全性については何が言えるでしょうか?特に、バッファリングされた読み取り操作の場合、同じ文字が2つの異なるスレッドに返され、同じ読み込み呼び出しを同時に行うことは可能ですか?

+0

stdoutの出力がスレッドセーフでないライブラリについて聞いたことはないと思います(私は通常のC/C++ランタイム、C#、Javaなどを考えています)。私はそれがここでもOKだと言うだろうと推測してください。しかし+1の良い質問。 – Mehrdad

+0

Linuxの 'putStrLn'と' [write'](http://linux.die.net/man/2/write)と['select'](http://linux.die.net/man/2/select)は、固定長のブロック(ラインバッファまたはブロックバッファリングの場合)のために結合するので、 'write'がスレッドセーフであるかどうかが問題です。 POSIXでは 'write'(1003.1-2001:2.9.1&2.9.7)のスレッドセーフティが必要ですが、通常はそうです。 – JJJ

+0

'' futex'(http://linux.die.net/man/4/futex)で実装された '' MVar''ロック( 'threaded'ランタイムの場合)。だから@ shachafの答えは正しいです。 – JJJ

答えて

28

はい、あなたが尋ねる意味でスレッドセーフです。 Handleは、MVarによって保護されているため、バッファが破損することはありません。あなたが指摘したように、インターリーブは別の問題です。

関連する問題