2012-11-25 13 views
29

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?

+0

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

+0

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

+0

I blocchi 'MVar' implementati con [' futex'] (http://linux.die.net/man/4/futex) (quando con il runtime 'threaded'). Quindi la risposta @shachaf è corretta. – JJJ

risposta

28

Sì, è thread-safe nel senso che stai chiedendo informazioni. Un Handle è protetto da un valore MVar che non consente il danneggiamento del buffer. Come hai sottolineato, però, l'interleaving è una questione diversa.

Problemi correlati