簡體   English   中英

需要幫助來了解“ ABA”問題

[英]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方法運行時headhead->next都必須穩定-但是CAS只為head保證這一點。 它默默地假設head->next在不更改head情況head->next不會更改,這是錯誤的。 因此它讀取的內容為current->next ,不久之后,它發生了變化。

它還說:最后一個操作,不應該由foo SUCCEEDS執行比較和交換。

那應該怎么辦? 加載相同的地址,然后重試? 有什么區別?

是。 該方法需要等待(或繼續嘗試),直到沒人弄亂它下面的結構。

但是如果更改后的對象已正確初始化,並且下一個指針包含指向已初始化對象的指針,那又是什么問題呢?

可以是任何東西。 違反類的不變性,兩次釋放/內存泄漏,數據丟失等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM