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.