Являются ли стандартные потоки вывода в С++ поточно-безопасными (cout, cerr, clog)?

Я знаю, что нет понятия потоков в текущем C++, но в этой статье говорится:

Типичные, потокобезопасные, портативные механизм регистрации

.....

Функция fprintf() является потокобезопасной, поэтому даже если этот журнал используется из различные потоки, выходные линии не будет скремблироваться.

Как насчет cout, cerr и clog?

Я думаю, что этот вопрос применим ко всем типам потоков в С++, например, fstream и stringstream.

Ответ 1

В статье говорится о стандарте POSIX для API fprintf. Он ничего не говорит о потоках С++. И это совершенно правильно, поскольку в этих потоках нет таких гарантий.

Обратите внимание, что хотя класс ведения журналов в этой статье использует синтаксис потока С++, он делает это с помощью объекта std::ostringstream, который создается и уничтожается для каждого события регистрации, и поэтому не распространяется между потоками. Он использует fprintf для фактического написания содержимого на консоли.

В библиотеке Microsoft C некоторые утверждения утверждают, что они совместимы с POSIX, поэтому код в статье, вероятно, довольно широко переносится (так как многие другие популярные операционные системы совместимы с POSIX). Но это не означает, что стандартные потоки С++ являются потокобезопасными.

Ответ 2

Это будет специфическая для реализации детальность. Вы можете спросить, есть ли в компиляторе X с библиотекой времени выполнения Y потоковые стандартные потоки, но вы не можете спросить, выполняются ли все реализации, потому что реализации могут отличаться в отношении безопасности потоков. Это часть того, что означает, что С++ не имеет встроенной концепции потоков. Все это специфично для реализации.

Ответ 3

Поскольку текущий стандарт С++ даже не признает, что есть вещи, называемые "потоками", он, конечно же, не дает никаких гарантий относительно безопасности потоков.

Все это определяется реализацией.