Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading putStrLn线程安全吗?_Multithreading_Haskell_Thread Safety - Fatal编程技术网

Multithreading putStrLn线程安全吗?

Multithreading putStrLn线程安全吗?,multithreading,haskell,thread-safety,Multithreading,Haskell,Thread Safety,我知道,如果有多个线程在没有任何并发控制的情况下调用putStrLn,那么线程的输出可能是交错的 我的问题是,putStrLn对这个交织输出进行模化是否是线程安全的 我假设putStrLn是一个缓冲写操作,所以我真的想知道如果两个线程同时调用putStrLn,是否会损坏输出缓冲区 一般来说,关于Haskell(实际上是GHC)的其他“标准I/O”函数的线程安全性可以说些什么?特别是,对于任何缓冲读取操作,同一字符是否有可能返回到同时进行相同读取调用的两个不同线程?是的,从您询问的意义上讲,这是线

我知道,如果有多个线程在没有任何并发控制的情况下调用
putStrLn
,那么线程的输出可能是交错的

我的问题是,
putStrLn
对这个交织输出进行模化是否是线程安全的

我假设
putStrLn
是一个缓冲写操作,所以我真的想知道如果两个线程同时调用
putStrLn
,是否会损坏输出缓冲区


一般来说,关于Haskell(实际上是GHC)的其他“标准I/O”函数的线程安全性可以说些什么?特别是,对于任何缓冲读取操作,同一字符是否有可能返回到同时进行相同读取调用的两个不同线程?

是的,从您询问的意义上讲,这是线程安全的。
句柄
MVar
保护,该MVar不允许缓冲区损坏。不过,正如您所指出的,交错是另一回事。

我想我从来没有听说过一个库的标准输出不是线程安全的(我想到的是常见的C/C++运行时、C#、Java等),所以如果我不得不猜测一下,我也会说它在这里是可以的+但是有一个好问题。在Linux
putStrLn
和friends上,通过并耦合固定长度的块(使用行缓冲或块缓冲时)实现,因此问题在于
写入
是否是线程安全的。POSIX要求
write
(1003.1-2001:2.9.1和2.9.7)具有线程安全性,通常情况下,它是。所以@shachaf的答案是正确的。