2009-09-27 8 views
10

Tôi biết rằng không có khái niệm về chủ đề trong hiện tại C++, nhưng this article is saying:Các luồng đầu ra tiêu chuẩn trong C++ thread-safe (cout, cerr, clog)?

Một typesafe, ThreadSafe, di cơ chế khai thác gỗ

.....

Các chức năng fprintf() là threadsafe, vì vậy ngay cả khi nhật ký này được sử dụng từ chủ đề khác nhau, các dòng đầu ra sẽ không bị tranh giành.

Điều gì về cout, cerrclog?

Tôi nghĩ câu hỏi này có thể áp dụng cho tất cả các loại luồng trong C++ cũng như fstreamstringstream.

+2

[Lưu ý: câu trả lời giờ là "có", trong C++ 11] (http://stackoverflow.com/a/6374525/87234). – GManNickG

+0

@GManNickG: Tôi sử dụng Visual Studio 2013 C++ và cout vẫn không phải là chủ đề an toàn. đầu ra trên màn hình chủ yếu là bị hỏng/trộn lẫn. –

+0

@MehmetFide: Chủ đề an toàn khác với đồng bộ hóa (chuỗi hỗn hợp/xen kẽ); C++ 11 guarentees tiêu chuẩn rằng việc thực hiện không dẫn đến các cuộc đua dữ liệu khi sử dụng các đối tượng này từ các luồng khác nhau, trong khi tối đa bạn đảm bảo rằng nhiều toán tử 'operator <<' được đồng bộ hóa. – legends2k

Trả lời

8

Bài viết đưa ra khiếu nại về tiêu chuẩn POSIX cho API fprintf. Nó không nói gì về các luồng C++. Và điều này là khá chính xác, vì không có đảm bảo như vậy trên những dòng. Lưu ý rằng mặc dù lớp ghi nhật ký trong bài viết đó sử dụng cú pháp luồng C++, nó thực hiện điều này thông qua đối tượng std::ostringstream được tạo và hủy cho mỗi sự kiện ghi nhật ký và do đó không được chia sẻ giữa các luồng. Nó sử dụng fprintf để thực sự ghi nội dung vào bảng điều khiển.

Thư viện Microsoft C đưa ra một số xác nhận là tuân thủ POSIX và do đó mã trong bài viết có thể khá rộng rãi (như nhiều hệ điều hành phổ biến khác tuân thủ POSIX). Nhưng điều này không có nghĩa là các luồng C++ chuẩn là an toàn chỉ.

9

Đó sẽ là chi tiết cụ thể về triển khai. Bạn có thể hỏi nếu Compiler X với Run Time Library Y có luồng tiêu chuẩn an toàn luồng không, nhưng bạn không thể hỏi tất cả các triển khai có thực hiện hay không, bởi vì việc triển khai được phép khác nhau liên quan đến an toàn luồng. Đây là một phần của ý nghĩa của nó mà C++ không có khái niệm chủ đề dựng sẵn. Đó là tất cả thực hiện cụ thể.

+0

Đó là những gì tôi nghĩ quá :) nhưng bài viết tuyên bố rằng mã là di động quá! – AraK

+2

Tôi đoán rằng tác giả của bài viết chỉ đơn giản nói rằng nó hoạt động ở mọi nơi anh ấy đã thử nó. Có lẽ anh ta đã không thử nó trên, nói, Keil C với HomeGrownRTOS v1.2, hoặc bất kỳ số lượng các kết hợp không phổ biến khác. –

+0

Bài viết không nói về luồng C++. –

3

Vì tiêu chuẩn C++ hiện tại thậm chí không thừa nhận rằng có những thứ gọi là "chủ đề", nên chắc chắn nó không đảm bảo về an toàn luồng.

Đây là tất cả được thực hiện xác định.