2012-11-25 20 views
29

Wiem, że jeśli mam wiele wątków wywoływanie putStrLn bez jakiejkolwiek kontroli współbieżności, że wyjście wątków mogą być przeplatane.Czy putStrLn jest bezpieczny dla wątków?

Moje pytanie brzmi, czy putStrLn jest bezpieczny dla wątków modulo z tym przeplecionym wyjściem?

Przypuszczam, że putStrLn jest buforowaną operacją zapisu, więc naprawdę pytam, czy może wystąpić jakiekolwiek uszkodzenie bufora wyjściowego przez jednoczesne wywoływanie dwóch wątków putStrLn.

Co generalnie można powiedzieć o bezpieczeństwie wątku funkcji Haskella (naprawdę GHC) innych "standardowych I/O" funkcji? W szczególności, dla każdej buforowanej operacji odczytu możliwe jest, aby ten sam znak został zwrócony do dwóch różnych wątków, wykonujących to samo wywołanie odczytu w tym samym czasie?

+0

Nie sądzę, że kiedykolwiek słyszałem o bibliotece, której wyjście standardowe nie jest wątkowe (myślę o zwykłych środowiskach wykonawczych C/C++, C#, Java itd.), Więc gdybym musiał zgadnij, że powiedziałbym, że tutaj też jest OK. Ale dobre pytanie. – Mehrdad

+0

W systemie Linux 'putStrLn' i przyjaciele zaimplementowane przez [' write'] (http://linux.die.net/man/2/write) i ['select'] (http://linux.die.net/man)/2/select) para dla bloków o stałej długości (przy buforowaniu liniowym lub blokowym), więc pytanie brzmi, czy 'write' jest wątkiem bezpiecznym czy nie. POSIX wymaga bezpieczeństwa wątku dla 'write' (1003.1-2001: 2.9.1 i 2.9.7), i zazwyczaj tak jest. – JJJ

+0

I "zamki MVar" zaimplementowane w ['futex'] (http://linux.die.net/man/4/futex) (gdy jest to w środowisku rtime' threaded'). Tak więc odpowiedź @shachaf jest poprawna. – JJJ

Odpowiedz

28

Tak, to wątek bezpieczny w tym sensie, że pytasz. A Handle jest chroniony przez MVar, który nie pozwoli na uszkodzenie bufora. Jak zauważyłeś, przeplatanie to jednak inna sprawa.

Powiązane problemy