lock free 實現多執行緒安全鍊錶

2021-06-19 10:14:42 字數 1797 閱讀 3239

lock free  實現的多執行緒鍊錶通常無法避免 aba問題。aba 問題的實質就是我們剛釋放的記憶體可能會被馬上又分配出來,被其他執行緒又放入到煉表裡了,導致interlock函式判斷鍊錶節點沒有改變(實際上節點已經被刪除過一次了,鍊錶發生了改變),而導致錯誤。

那麼解決方法最有3中:  一種不使用 interlock函式,一種就是在記憶體中增加計數標誌,一種就是不釋放記憶體。

不使用 interlock 肯定不現實;),通常認為非對稱記憶體伺服器下interlock 的效率比較高,重要的可能是interlock函式不會導致程式停頓,就是每一步都有進展 ,這樣就不可能發生死鎖。

增加計數標誌,原本在interlock中我們比較記憶體位址, 使用了計數標誌後,新分配的節點比較對這個計數器+1。這樣比較記憶體位址相同的節點時,我們再同時多檢查一次計數器。這樣就不會把新新增的節點誤會作已有的舊節點了。不過因為要同時判斷位址和計數標誌,這個方案實現較複雜。

這裡我採用了不釋放記憶體這個方案。就是在鍊錶的節點釋放時, 將節點放到記憶體佇列尾部裡,在申請節點記憶體時,從記憶體佇列頭部取出被釋放的記憶體。 這裡有乙個問題:

如果記憶體佇列中儲存的釋放節點數太少的話,就回出現剛釋放的記憶體立刻又被分配出去了。所以, 我們再分配記憶體的時候, 必須保證記憶體佇列內節點有一定的長度,這樣被分配出去的記憶體節點可能是很久前被釋放的記憶體。  那麼這個長度多少合適呢?其實應該節點數超過執行緒數量1倍應該就是安全的了。因為只需要保證競爭的執行緒間不會使用同樣的節點即可。

實現**如下:

template

class linkqueue

virtual ~linkqueue()

int push(t ele)

;return 0;

}bool find(t ele)

return false;

}bool findcompare(t& ele,pfnfindcompare pfn)

else

ph=ph->pnext;

}return false;

}int delete(t  ele)

else

}else

}return -1;

}int pop(t & ele)

private:

node* popnode()

while(interlockedcompareexchangepointer((volatile pvoid*)&m_phead->pnext,pnext,pold)!=pold);

return pold;}};

記憶體收集器:

template

class nodelinkgc

public:

/**/

explicit nodelinkgc(const unsigned int sz,const int limitcount=128)

m_ilimitcount = limitcount;}/*

這個可能還用不上

*/ static nodelinkgc* createinstance(const int sz,const int limitsize )

catch(char* perror)

if(pgc ==null)

if(::interlockedcompareexchangepointer((volatile pvoid*)&g_pgc,pgc,null) !=null)

}return (nodelinkgc*)g_pgc;

}t* allocate()}}

return null;

}int release(t * p)

return -1;}};

多執行緒 執行緒安全

原因 當多個執行緒同時共享,同乙個全域性變數或靜態變數。做寫的操作時,可能發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。解決方案 方式一 內建鎖synchronized synchronized保證執行緒原子性,當執行緒進入方法的時候,自動獲取鎖,一旦鎖被其它執行緒獲取...

多執行緒 執行緒安全

public class unsafethread t.start while thread.activecount 1 system.out.println sum 1 從主記憶體中講sum變數複製到執行緒的工作記憶體 2 在工作記憶體中修改變數 1操作 3 將sum變數從執行緒的工作記憶體寫回到...

多執行緒 執行緒安全

執行緒安全 多個執行流對臨界資源的爭搶訪問,但是不會出現資料二義性 執行緒安全的實現 同步 通過條件判斷保證對臨界資源訪問的合理性 互斥 通過同一時間對臨界資源訪問的唯一性實現臨界資源訪問的安全性 互斥鎖實現的原理 互斥鎖本身是乙個只有0 1的計數器,描述了乙個臨界資源當前的訪問狀態,所有執行流在訪...