2012-11-25 35 views
29

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?

+0

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

+0

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

+0

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

Trả lời

28

Có, đó là chủ đề an toàn theo nghĩa bạn đang hỏi. A Handle được bảo vệ bởi một MVar sẽ không cho phép bộ đệm bị hỏng. Như bạn đã chỉ ra, mặc dù, xen kẽ là một vấn đề khác.

Các vấn đề liên quan