So che se ho più thread che chiamano putStrLn
senza alcun tipo di controllo della concorrenza, l'output dei thread può essere interlacciato.PutStrLn è thread-safe?
La mia domanda è se putStrLn
è thread-safe modulo questo output intercalato?
Presumo che l'operazione di scrittura bufferizzata sia putStrLn
, quindi mi chiedo davvero se il danneggiamento del buffer di output può verificarsi con due thread che chiamano allo stesso tempo putStrLn
.
E in generale, che cosa si può dire sulla sicurezza del thread delle altre funzioni "standard I/O" di Haskell (in realtà GHC)? In particolare, per una qualsiasi delle operazioni di lettura bufferizzate è possibile che lo stesso carattere venga restituito a due thread diversi che effettuano la stessa chiamata di lettura contemporaneamente?
Non penso di aver mai sentito di una libreria il cui output stdout non è thread-safe (sto pensando ai soliti runtime di C/C++, C#, Java, ecc.) Quindi se dovessi immagino direi che va bene anche qui. 1 buona domanda però. – Mehrdad
Su Linux 'putStrLn' e gli amici implementati tramite [' scrivi'] (http://linux.die.net/man/2/write) e ['select'] (http://linux.die.net/man/2/select) coppia per blocchi di lunghezza fissa (quando con buffer di riga o blocco), quindi la domanda è se 'write' è thread-safe o no. POSIX richiede thread-safety per 'write' (1003.1-2001: 2.9.1 e 2.9.7), e di solito lo è. – JJJ
I blocchi 'MVar' implementati con [' futex'] (http://linux.die.net/man/4/futex) (quando con il runtime 'threaded'). Quindi la risposta @shachaf è corretta. – JJJ