C++ 標準程式庫中的執行緒安全
下列執行緒安全性規則適用於 C++ 標準程式庫中的所有類別 (這包括 shared_ptr
),如下所述。 有時會提供更強的保證,例如標準 iostream 物件,如下所述,以及用於多線程的類型,例如 <atomic>
。
物件為安全執行緒,可供從多個執行緒讀取。 例如,提供物件 A,則可以安全地同時從執行緒 1 和執行緒 2 讀取 A。
如果某個執行緒正在寫入物件,則必須保護相同或其他執行緒上,對該物件進行的所有讀取和寫入。 例如,提供物件 A 時,如果執行緒 1 正在寫入至 A,則必須防止執行緒 2 讀取或寫入至 A。
即使另一個線程正在讀取或寫入相同類型的不同實例,還是可以安全地讀取和寫入類型的某個實例。 例如,假設物件 A 和 B 的類型相同,則當 A 在線程 1 中寫入且 B 正在線程 2 中讀取時,這是安全的。
shared_ptr
即使對象是共用擁有權的複本,多個線程也可以同時讀取和寫入不同的 shared_ptr
物件。
iostream
標準 iostream 物件 cin
、cout
、、、cerr
wcin
clog
、 wcout
wcerr
和 wclog
遵循與其他類別相同的規則,但例外狀況如下:從多個線程寫入物件是安全的。 例如,線程 1 可以與線程 2 同時寫入 cout
。 不過,這可能會導致混合來自兩個執行緒的輸出。
注意
從資料流緩衝區中讀取,不視為讀取作業。 相反地,它被視為寫入作業,因為類別的狀態已變更。