[英]What the correct way when use Double-Checked Locking with memory barrier in c++?
我剛剛讀了優秀的博客C ++和Double-Checked Locking的危險
而且我不明白為什么我們必須使用示例12中的第一個內存屏障(如下所示):
Singleton* Singleton::instance () {
Singleton* tmp = pInstance;
... // insert memory barrier
if (tmp == 0) {
Lock lock;
tmp = pInstance;
if (tmp == 0) {
tmp = new Singleton;
... // insert memory barrier
pInstance = tmp;
}
}
return tmp;
}
將其更改為以下代碼是否安全? 為什么不?
Singleton* Singleton::instance () {
if (pInstance == 0) {
Lock lock;
if (pInstance == 0) {
Singleton* tmp = new Singleton;
... // insert memory barrier
pInstance = tmp;
}
}
return pInstance;
}
不,這不安全。 閱讀示例之前的三段以及之后的兩段,潛在的問題是系統在刷新Singleton
結構之前在線程B上完成了對pInstance
的寫入(刷新到內存)。 然后線程A可以讀取pInstance
,將指針視為非空,然后返回該指針,從而可能允許線程A在線程B將其存儲到內存中之前訪問Singleton
。
在嘗試在其他線程中使用它之前 ,必須進行第一次刷新,以確保在構造Singleton
期間完成對寫操作的刷新。
取決於您所運行的硬件,這可能不是問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.