Segurança de threads na Biblioteca Padrão C++
As regras para acesso thread-safe a seguir se aplicam a todas as classes na Biblioteca Padrão C++. Isso inclui shared_ptr, como descrito a seguir. Às vezes, são dadas garantias maiores, por exemplo, os objetos iostream padrão, como descrito a seguir, e os tipos projetados especificamente para multithreading, como os em <atomic>.
Um objeto é thread-safe para leitura de vários threads. Por exemplo, dado um objeto A, é seguro ler A do thread 1 e do thread 2 simultaneamente.
Se um objeto estiver sendo gravado por um thread, todas as leituras e as gravações nesse objeto no mesmo thread ou em outros deverão ser protegidas. Por exemplo, dado um objeto A, se o thread 1 estiver sendo gravado em A, o thread 2 deverá ser impedido de ler de ou gravar em A.
É seguro ler e gravar em uma instância de um tipo, mesmo que outro thread esteja lendo ou gravando em uma instância diferente do mesmo tipo. Por exemplo, dados os objetos A e B do mesmo tipo, é seguro quando A está sendo gravado no thread 1 e B está sendo gravado no thread 2.
shared_ptr
Vários threads podem ler e gravar simultaneamente objetos shared_ptr diferentes, mesmo quando os objetos são cópias que compartilham a propriedade.
iostream
Os objetos iostream padrão cin, cout, cerr, clog, wcin, wcout, wcerr e wclog seguem as mesmas regras das outras classes, com esta exceção: é seguro gravar em um objeto de vários threads. Por exemplo, o thread 1 pode gravar cout ao mesmo tempo em que o thread 2. Porém, isso pode misturar a saída dos dois threads.
Dica
A leitura de um buffer de stream não é considerada uma operação segura.Em vez disso, ela é considerada um operação de gravação, porque o estado da classe muda.