Tôi biết rằng nếu tôi có nhiều chủ đề gọi putStrLn
mà không có bất kỳ loại điều khiển đồng thời nào thì đầu ra của các chuỗi có thể được xen kẽ.Chủ đề an toàn có được putStrLn không?
Câu hỏi của tôi là liệu putStrLn
có phải là chủ đề an toàn modulo kết xuất xen kẽ này không?
Tôi giả định rằng putStrLn
là một thao tác ghi đệm, vì vậy tôi thực sự hỏi liệu có bất kỳ tham nhũng nào của bộ đệm đầu ra có thể xảy ra do có hai chuỗi gọi putStrLn
cùng một lúc.
Và nói chung, điều gì có thể nói về độ an toàn của các chức năng "I/O tiêu chuẩn" của Haskell (thực sự của GHC)? Đặc biệt, đối với bất kỳ hoạt động đọc đệm nào có thể cho cùng một ký tự được trả về hai luồng khác nhau thực hiện cùng một cuộc gọi đọc cùng một lúc?
Tôi không nghĩ rằng mình từng nghe về thư viện có đầu ra không an toàn (tôi nghĩ đến các thời gian chạy C/C++ thông thường, C#, Java, v.v.) vì vậy nếu tôi phải hãy đoán tôi có thể nói ở đây cũng OK. 1 câu hỏi hay. – Mehrdad
Trên Linux 'putStrLn' và bạn bè được triển khai thông qua [' write'] (http://linux.die.net/man/2/write) và ['select'] (http://linux.die.net/man/2/select) cặp cho các khối có chiều dài cố định (khi có dòng hoặc khối đệm), vì vậy câu hỏi đặt ra là liệu 'write' có an toàn thread hay không. POSIX yêu cầu an toàn luồng cho 'write' (1003.1-2001: 2.9.1 & 2.9.7), và thường là nó. – JJJ
Và các khóa 'MVar' được triển khai với [' futex'] (http://linux.die.net/man/4/futex) (khi có 'thời gian chạy' luồng). Vì vậy, câu trả lời @shachaf là chính xác. – JJJ