Являются ли стандартные потоки вывода в С++ поточно-безопасными (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
Поскольку текущий стандарт С++ даже не признает, что есть вещи, называемые "потоками", он, конечно же, не дает никаких гарантий относительно безопасности потоков.
Все это определяется реализацией.