Потокобезопасность в стандартной библиотеке C++
Следующие правила потокобезопасности применяются ко всем классам в стандартной библиотеке C++, включая shared_ptr, как описано ниже. Иногда предоставляются более строгие гарантии, например, для стандартных объектов iostream, как описано ниже, и типов, специально предназначенных для многопотоковой работы, таких как типы <atomic>.
Объект является потокобезопасным при чтении из нескольких потоков. Например, объект А можно безопасно считать из потока 1 и потока 2 одновременно.
Если объект записывается одним потоком, то все операции чтения и записи в этот объект в одном или других потоках должны быть защищены. Например, если поток 1 записывает данные в объект А, потоку 2 следует запретить чтение из объекта А и запись в него.
Можно безопасно читать и записывать данные в один экземпляр типа, даже если другой поток читает или записывает другой экземпляр того же типа. Например, при наличии объектов А и Б одного типа можно безопасно записывать объект А в потоке 1 и читать объект Б в потоке 2.
shared_ptr
Несколько потоков могут одновременно читать и записывать разные объекты shared_ptr, даже если они являются копиями с одним владельцем.
iostream
Стандартные объекты iostream cin, cout, cerr, clog, wcin, wcout, wcerr и wclog следуют тем же правилам, что и другие классы, с одним исключением: можно безопасно записывать объект из нескольких потоков. Например, поток 1 может записывать данные в cout одновременно с потоком 2. Однако это может привести к смешиванию выходных данных двух потоков.
Примечание
Чтение из буфера потока считается не операцией чтения,а операцией записи, так как состояние класса меняется.