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