Segurança de threads na Biblioteca Padrão C++

As regras de acesso thread-safe a seguir se aplicam a todas as classes da Biblioteca Padrão C++. Isso inclui shared_ptr, conforme descrito abaixo. Às vezes, são dadas garantias maiores, por exemplo, os objetos iostream padrão, como descrito a seguir, e os tipos projetados 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 lido 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 em cout ao mesmo tempo em que o thread 2. Porém, isso pode misturar a saída dos dois threads.

Observação

A leitura de um buffer de stream não é considerada uma operação segura. Em vez disso, ela é considerada uma operação de gravação, porque o estado da classe muda.

Confira também

Visão geral da biblioteca padrão C++