Подтвердить что ты не робот

Является ли putStrLn потокобезопасным?

Я знаю, что если у меня есть несколько потоков, вызывающих putStrLn без какого-либо элемента управления concurrency, что вывод потоков может чередоваться.

Мой вопрос в том, является ли putStrLn потокобезопасным по модулю этого чередующегося вывода?

Я предполагаю, что putStrLn является буферизованной операцией записи, поэтому я действительно спрашиваю, может ли быть повреждение выходного буфера, если два потока вызовут putStrLn в то же время.

И вообще, что можно сказать о безопасности потоков для Haskell (действительно GHC) других функций "стандартного ввода-вывода"? В частности, для любой из операций буферизованного считывания возможно, чтобы один и тот же символ возвращался к двум различным потокам, одновременно делая один и тот же вызов чтения?

4b9b3361

Ответ 1

Да, это поточно-безопасный в том смысле, о котором вы просите. A Handle защищен MVar, который не позволит повреждению буфера. Однако, как вы указали, чередование - это другое дело.