我有一個結構節點。內部是指向下一個節點(Node *next)的指標。
我的圖是這樣的,每個 next 指標只能指向一個節點和圖中已經存在的同一個節點。
在我的示例中,多個執行緒可以在節點上運行。考慮下面的示例,同時知道節點 a 和 b 之前已安全地添加到圖中。
代碼示例:
Node* a = new Node;
Node* b = new Node;
// from now on multiple threads at the same time
a->next = b;
考慮到指標分配不是原子的,a->next 是否無效?
編輯 1:我在所有執行緒停止運行后檢查下一個指標。
uj5u.com熱心網友回復:
對同一非原子變數的不同步并發寫入會導致未定義的行為。
[intro.races]/2:
如果其中一個修改了記憶體位置 ([intro.memory]) 并且另一個讀取或修改了相同的記憶體位置,則兩個運算式計算會發生沖突。
[intro.races]/21
...如果程式的執行包含兩個潛在的并發沖突動作,則程式的執行包含資料競爭,其中至少一個不是原子的,并且兩者都不會在另一個之前發生...
任何此類資料競爭都會導致未定義的行為。
您的特定場景聽起來可能在實踐中有效,但我不會這樣做,除非您已經嘗試過原子并且基準測驗表明它們會導致性能問題。
如果您打算使用原子,您可以嘗試使用std::memory_order_relaxed. 從你的描述來看,應該是安全的。
uj5u.com熱心網友回復:
如果您在所有執行緒完成分配后檢查 a->next 。這將是有效的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/438338.html
