C 多執行緒 無鎖鏈表

2021-10-02 02:23:16 字數 1206 閱讀 2819

前面,為了使得寫操作快速進行,我們定義了順序鎖。但是順序鎖有個缺點,那就是處理的資料不能是指標,否則可能會導致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 這裡有兩種方法通過成員函式建立。而這兩種方法恰好也就是靜態成員函式和非靜態成員函式的區別。靜態成員函式與物件無關,只屬於類...