前面,為了使得寫操作快速進行,我們定義了順序鎖。但是順序鎖有個缺點,那就是處理的資料不能是指標,否則可能會導致exception。那麼有沒有辦法使得處理的資料報括指標呢?當然要是這個鍊錶沒有鎖,那就更好了。
針對這種無鎖鏈表,我們可以初步分析一下,應該怎麼設計呢?
(1)讀操作沒有鎖,那麼怎麼判斷讀操作正在進行呢,只能靠標誌位了;
(2)寫操作沒有鎖,那麼讀操作只能乙個執行緒完成;
(3)寫操作中如果是新增,那麼直接加在末尾即可;
(4)寫操作中如果是刪除,那麼應該先刪除資料,然後等到當前沒有操作訪問刪除資料時,釋放記憶體,但是首節點不能刪除。
普通鍊錶的結構為,
typedef
struct _link
link;
假設此時有32個執行緒在訪問鍊錶,那麼可以定義乙個全域性變數value,每乙個bit表示乙個thread,讀操作怎麼進行呢,
void
read_process()
那麼,寫操作怎麼進行呢,
void
write_process_add
(link* phead, link* plink)
void
write_process_del
(link* phead, link* plink)
free
(plink)
;}
其中鍊錶的刪除操作為,
/*
* from:
* -> a -> b -> c -> d
* * to:
* -----------------
* | v
* -> a b -> c ->d
*
*/
總結:
(1)這種無鎖鏈表有很多侷限:多讀少寫、注意使用原子操作、不能刪除頭結點、資料只能新增到尾部、注意刪除順序和方法、讀執行緒個數有限制等等;
(2)寫操作在操作前需要等待所有的讀操作,否則有可能發生異常;
(3)寫操作不能被多個執行緒使用;
(4)無鎖鏈表應用範圍有限,只是特殊情況下的一種方案而已。
多執行緒的那點兒事16(之無鎖鏈表)
前面,為了使得寫操作快速進行,我們定義了順序鎖。但是順序鎖有個缺點,那就是處理的資料不能是指標,否則可能會導致exception。那麼有沒有辦法使得處理的資料報括指標呢?當然要是這個鍊錶沒有鎖,那就更好了。針對這種無鎖鏈表,我們可以初步分析一下,應該怎麼設計呢?1 讀操作沒有鎖,那麼怎麼判斷讀操作正...
c 執行緒池 多執行緒
1。設定引數類 using system using system.collections.generic using system.text public class stateinfo 執行緒開啟方法類 using system using system.collections.generic ...
C 多執行緒 建立執行緒
c 中線程的建立一般是通過std thread類實現的,具體的實現方式有以下幾種 void operator int a 過載括號運算子。如果無參則為void operator 這裡有兩種方法通過成員函式建立。而這兩種方法恰好也就是靜態成員函式和非靜態成員函式的區別。靜態成員函式與物件無關,只屬於類...