[英]Need help in understanding the “ABA” problem
我讀了一篇描述ABA問題的文章,但是有些事情我聽不懂。 我有源代碼,該源代碼無法正常工作,並且與本文中的示例相似,但我不理解問題所在。 這是文章
http://fara.cs.uni-potsdam.de/~jsg/nucleus/index.php?itemid=6
它說:盡管head_的實際值是相同的(a)next_指針不是
但是怎么可能呢? 如果兩個結構對象
struct node {
node *next;
data_type data;
};
“ head_”和“ current”指向內存中的同一區域,head _-> next和current-> next如何指向不同?
它還說:最后一個操作,不應該由foo SUCCEEDS執行比較和交換。
那應該怎么辦? 加載相同的地址,然后重試? 有什么區別?
當前在我的代碼中,我有類似的情況,我在對象上執行CompareAndSwap,這可能會被另一個線程更改為地址相似的對象
deleted.compare_exchange_strong(head, 0);
但是如果更改后的對象已正確初始化,並且下一個指針包含指向已初始化對象的指針,那又是什么問題呢?
提前致謝。
“ head_”和“ current”指向內存中的同一區域,head _-> next和current-> next如何指向不同?
他們不; 但是代碼需要在pop
方法運行時head
和head->next
都必須穩定-但是CAS只為head
保證這一點。 它默默地假設head->next
在不更改head
情況head->next
不會更改,這是錯誤的。 因此它讀取的內容為current->next
,不久之后,它發生了變化。
它還說:最后一個操作,不應該由foo SUCCEEDS執行比較和交換。
那應該怎么辦? 加載相同的地址,然后重試? 有什么區別?
是。 該方法需要等待(或繼續嘗試),直到沒人弄亂它下面的結構。
但是如果更改后的對象已正確初始化,並且下一個指針包含指向已初始化對象的指針,那又是什么問題呢?
可以是任何東西。 違反類的不變性,兩次釋放/內存泄漏,數據丟失等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.