眾所周知,shared_ptr僅保證對底層控制塊的訪問是執行緒安全的,并且不保證對擁有物件的訪問。
那么為什么下面的代碼片段中存在競爭條件:
std::shared_ptr<int> g_s = std::make_shared<int>(1);
void f1()
{
std::shared_ptr<int>l_s1 = g_s; // read g_s
}
void f2()
{
std::shared_ptr<int> l_s2 = std::make_shared<int>(3);
std::thread th(f1);
th.detach();
g_s = l_s2; // write g_s
}
在上面的代碼片段中,命名的共享指標的擁有物件g_s確實沒有被訪問。
我現在真的很困惑。有人可以對此事有所了解嗎?
uj5u.com熱心網友回復:
std::shared_ptr<T>保證對其控制塊的訪問是執行緒安全的,但不能訪問std::shared_ptr<T>實體本身,實體本身通常是一個具有兩個資料成員的物件:原始指標(由 回傳的get()那個)和指向控制塊的指標。
在您的代碼中,std::shared_ptr<int>兩個執行緒可能同時訪問同一個實體;f1讀,f2寫。
如果兩個執行緒正在訪問共享同一物件所有權的兩個不同 shared_ptr實體,則不會發生資料競爭。這兩個實體將具有相同的控制塊,但對控制塊的訪問將由庫實作適當地同步。
如果您需要從多個執行緒對單個 std::shared_ptr<T>實體進行并發、無競爭的訪問,您可以使用std::atomic<std::shared_ptr<T>>. (還有一個在 C 20 之前可以使用的舊介面,在 C 20 中已棄用。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/479434.html
下一篇:使用連接將字符轉換為字串時的垃圾
