2009-09-27 6 views
10

wiem, że nie ma pojęcia wątków w bieżącej C++, ale this article is saying:Czy standardowe strumienie wyjściowe są wątkowe w C++ (cout, cerr, clog)?

A typesafe, threadsafe przenośne mechanizm rejestrowania

.....

Funkcja fprintf() jest wątkowo bezpieczna, , więc nawet jeśli ten dziennik jest używany od różnych wątków, linie wyjściowe nie będzie kodowany.

Co cout, cerr i clog?

Myślę, że to pytanie dotyczy wszystkich typów strumieni w C++, takich jak: fstream i stringstream.

+2

[Uwaga: odpowiedź brzmi "tak", w C++ 11] (http://stackoverflow.com/a/6374525/87234). – GManNickG

+0

@GManNickG: Używam Visual Studio 2013 C++ i cout nadal nie jest bezpieczny dla wątków. wyjścia na ekranie są w większości uszkodzone/wymieszane. –

+0

@MehmetFide: Bezpieczeństwo wątków różni się od synchronizacji (ciągi mieszane/przeplecione); Standardy C++ 11 gwarantują, że implementacja nie prowadzi do wyścigów danych po użyciu tych obiektów z różnych wątków, podczas gdy Ty musisz upewnić się, że wiele połączeń 'operator <<' jest zsynchronizowanych. – legends2k

Odpowiedz

8

Artykuł zawiera zastrzeżenie dotyczące standardu POSIX dla interfejsu API fprintf. Nie mówi nic o strumieniach C++. Jest to całkiem poprawne, ponieważ nie ma takich gwarancji w tych strumieniach.

Należy zauważyć, że chociaż klasa logowania w tym artykule używa składni strumienia C++, robi to za pomocą obiektu std::ostringstream, który jest tworzony i niszczony dla każdego zdarzenia rejestrowania, a więc nie jest dzielony między wątki. Używa fprintf, aby zapisać zawartość na konsoli.

Biblioteka Microsoft C twierdzi, że niektóre roszczenia są zgodne z POSIX, a więc kod w artykule prawdopodobnie jest dość szeroko przenośny (jak wiele innych popularnych systemów operacyjnych jest zgodnych z POSIX). Ale to nie oznacza, że ​​standardowe strumienie C++ są wątkowo bezpieczne.

9

To byłby szczegół dotyczący wdrożenia. Możesz zapytać, czy kompilator X z biblioteką czasu pracy Y ma standardowe strumienie bezpieczne dla wątków, ale nie możesz zapytać, czy wszystkie implementacje tak robią, ponieważ implementacje mogą różnić się pod względem bezpieczeństwa wątków. Jest to część tego, co oznacza, że ​​C++ nie ma wbudowanej koncepcji wątków. Jest to wszystkie specyficzne dla implementacji.

+0

To, co myślę też :) ale artykuł twierdzi, że kod jest również przenośny! – AraK

+2

Przypuszczam, że autor artykułu mówi po prostu, że działa wszędzie, gdzie go wypróbował. Prawdopodobnie nie wypróbował go, powiedzmy, Keila C z HomeGrownRTOS v1.2, lub dowolnej liczby innych nietypowych kombinacji. –

+0

Artykuł nie mówi o strumieniach C++. –

3

Ponieważ obecny standard C++ nawet nie uznaje, że istnieją rzeczy zwane "wątkami", z pewnością nie daje żadnych gwarancji dotyczących bezpieczeństwa wątków.

To wszystko definiowane przez implementację.

Powiązane problemy