在我的應用程式中,多個執行緒需要訪問映射物件以插入新專案或讀取現有專案。(沒有“擦除”操作)。
執行緒使用此代碼訪問地圖元素:
struct PayLoad& ref = myMap[index];
我只是想知道我是否還需要將此代碼塊包裝在 mutex 內?或者不為此目的使用互斥鎖是否安全?
謝謝。
uj5u.com熱心網友回復:
由于至少有一個寫操作,即一個insert,那么在訪問map的時候需要有執行緒同步。否則你有一個競爭條件。
此外,回傳對映射中值的參考不是執行緒安全的:
struct PayLoad& ref = myMap[index];
因為多個執行緒可以訪問該值,并且其中至少一個可能涉及寫入。這也將導致競爭條件。最好按值回傳值,如下所示:
Payload GetPayload(int index)
{
std::lock_guard<std::mutex> lock(mutex);
return myMap[index];
}
wheremutex是一個可訪問的std::mutex物件。
您的插入/寫入操作還需要鎖定相同的互斥鎖:
void SetPayload(int index, Payload payload)
{
std::lock_guard<std::mutex> lock(mutex);
myMap[index] = std::move(payload);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504223.html
上一篇:Z3py背景關系使用
