Потокобезопасность в стандартной библиотеке C++

Следующие правила потокобезопасности применяются ко всем классам в стандартной библиотеке C++, включая shared_ptr, как описано ниже. Иногда предоставляются более строгие гарантии, например стандартные объекты iostream, как описано ниже, и типы, предназначенные для многопоточности, например <atomic>в .

Объект является потокобезопасным при чтении из нескольких потоков. Например, объект А можно безопасно считать из потока 1 и потока 2 одновременно.

Если объект записывается одним потоком, то все операции чтения и записи в этот объект в одном или других потоках должны быть защищены. Например, если поток 1 записывает данные в объект А, потоку 2 следует запретить чтение из объекта А и запись в него.

Это безопасно для чтения и записи в один экземпляр типа, даже если другой поток считывает или записывает в другой экземпляр одного типа. Например, учитывая объекты A и B одного типа, это безопасно, когда A записывается в потоке 1 и B считывается в потоке 2.

shared_ptr

Несколько потоков могут одновременно считывать и записывать различные shared_ptr объекты, даже если объекты копируются, которые совместно используются для владения.

iostream

Стандартные объекты ciniostream , cout, cerrclogwcoutwcinwcerrи следуйте тем же правилам, что и wclog другие классы, за исключением этого: это безопасно для записи в объект из нескольких потоков. Например, поток 1 может записывать cout в одно и то же время, что и поток 2. Однако это может привести к смешиванию выходных данных двух потоков.

Примечание.

Чтение из буфера потока считается не операцией чтения, Вместо этого она считается операцией записи, так как состояние класса изменяется.

См. также

Общие сведения о стандартной библиотеке C++