Поделиться через


Потокобезопасность в стандартной библиотеке 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. Однако это может привести к смешиванию выходных данных двух потоков.

Примечание

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

См. также

Ссылки

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