天天看點

談談stl标準庫的線程安全性

線程安全規則應用到标準 C++ 庫中的所有類,這也包括 shared_ptr,如下所述。 有時提供更強的保證(例如,如下所述的标準 iostream 對象和專門用于多線程的類型,如 中的類型)。

從多個線程讀取某個對象時,該對象是線程安全的。 

例如,給定對象 A,可安全地同時從線程 1 和線程 2 讀取 A。

如果要通過某個線程寫入到對象,則必須保護相同線程或其他線程上所有對該對象的讀取和寫入。 

例如,給定對象 A,如果線程 1 将寫入到 A,則必須阻止線程 2 讀取或寫入 A。

注意:即使另一個線程正在讀取或寫入同一類型的其他執行個體,本線程也可以安全地讀取和寫入該類型的某個執行個體。 

例如,給定同一類型的對象 A 和 B,線上程 1 中寫入 A 的同時可以安全地線上程 2 中讀取 B。

shared_ptr

即使對象是共享所有權的副本,多個線程也可以同時讀取和寫入不同的 shared_ptr 對象。

這篇文章講的很詳細shared_ptr線程安全性分析

iostream

标準 iostream 對象 cin、cout、cerr、clog、wcin、wcout、wcerr 和 wclog 遵循與其他類相同的規則,但存在此例外:可以安全地從多個線程寫入一個對象。 例如,可以将線程 1 和線程 2 同時寫入 cout。 但是,此操作可能會導緻兩個線程的輸出相混合。