我想知道如何安全地使用原子操作來管理共享指針。原來,VC11(Visual Studio 2012)支持C++ 11,因此可以允許在std :: shared_ptr上進行讀/寫比賽。 我想檢查我瞭解的基礎知識,然後問一些關於在VC11 std :: shared_ptr原子操作的實現細節。在VC11中的std :: shared_ptr上的atomic_load/atomic_store - 爲什麼全局螺旋鎖?
std::shared_ptr<A> x, y, z;
x = std::make_shared<A>(args1);
y = std::make_shared<A>(args2);
線程1
std::shared_ptr<A> temp = std::atomic_load(y);
線程2
std::atomic_store(&y, z);
沒有原子公司,比賽會潛在地引起temp
到結束有損壞狀態,或線程2可以刪除A實例正如線程1試圖複製和加入shared_ptr一樣,這會使它指向一個「殭屍」對象。
我就atomic_load和atomic_store在VC11問題:
我注意到他們使用其對全局變量檢查並設置一個環形鎖。 所以我想知道:爲什麼不在shared_ptr本身的引用計數器的最高位進行測試和設置?這種方式鎖定不同的shared_ptr將不會相互競爭。這是沒有原因嗎?編輯:VS執行atomic_is_lock_free
。毫不奇怪,因爲它使用了一切自旋鎖。仍然想知道爲什麼他們不能使用shared_ptr-instance特定的鎖而不是全局鎖。
template <class _Ty> inline
bool atomic_is_lock_free(const shared_ptr<_Ty> *)
{ // return true if atomic operations on shared_ptr<_Ty> are lock-free
return (false);
}
您是否檢查過std :: atomic_is_lock_free(&some_shared_ptr)在您的平臺上是否爲true。 – inf 2013-03-09 11:26:27
我讀了'shared_ptr'在裏面使用原子操作。也許你不需要把它們混合在一起。我對嗎? – deepmax 2013-03-09 11:44:38
shared_ptr使用原子操作來遞增和遞減其使用計數。如果沒有這些原子操作,引用計數器的值甚至可以通過讀取/讀取比賽(即,從相同的shared_ptr分配到本地一個線程的2個線程 - 也可以在某些排序下增加少於2個,如果它不是原子更新,但這並不能解決我在文章中提到的兩種競爭條件;這是一個單獨的問題 – yonil 2013-03-09 11:52:42