一讀一寫情況下,無鎖環形佇列如何實現?

2021-07-26 01:37:25 字數 1591 閱讀 9232

無鎖環形佇列的設計及示例,讀寫佇列最大的應用是:乙個執行緒收到事件或訊息後直接

加入到佇列,而處理執行緒讀取佇列中的事件或訊息,並加以處理。在這個模式中,有乙個線

程負責寫,多個處理執行緒讀自己的佇列並處理。雖然看起來象是一寫多讀,其實不然,針對

某一事件佇列而言,只有乙個執行緒是寫乙個執行緒是讀。

環形一讀一寫佇列中,不需要擔心unsigned long溢位問題,因為溢位後自動回歸,相減

值還會保留。

1 示例一(注:max_count 必須為 2 的指數,即:2, 4, 8, 16

3//佇列尺寸

4#define max_count    4096 5

#define max_mask     4095     

//= max_count - 167

//變數

8void*          list[max_count];

9 unsigned 

long  push_count;

10 unsigned 

long  pop_count; 11

12//

初始化佇列

13void initqueue()

14  19

20//

加入21

bool push(

void* adata)

22  29

else

30return

false;

31 } 32

33//

取出34

void* pop()

35  45

46//

返回結果

47return result;

48 } 49

50 示例二(注:max_count >= 2): 51

52//

佇列尺寸

53#define max_count    4096 54

#define high_index   4095     

//= max_count - 1

5556

//變數

57void*          list[max_count];

58 unsigned 

long  push_count;

59 unsigned 

long  push_index;

60 unsigned 

long  pop_count;

61 unsigned 

long  pop_index; 62

63//

初始化佇列

64void initqueue()

65  72

73//

加入74

bool push(

void* adata)

75  87

else

88return

false;

89 } 90

91//

取出92

void* pop()

93 107

108//

返回結果

109return result;

110 }

Linux 多執行緒 」一寫多讀」 模式下的無鎖設計

延伸結語 在linux多執行緒環境下對同一變數進行讀寫時,經常會遇到讀寫的原子性問題,即會出現競爭條件。為了解決多個執行緒對同一變數訪問時的競爭條件問題,作業系統層面提供了鎖 訊號量 條件變數等幾種執行緒同步機制。如果對變數的每次訪問都使用上述機制,由於系統呼叫會陷入核心空間,需要頻繁的進行上下文切...

nodejs學習 一 讀檔案,寫檔案,檔案資訊

1 瀏覽器中的js全域性物件是window。但是在node中,全域性物件是global。2 process是node.js的乙個物件,它代表當前node.js的程序。process.nexttick function console.log nexttick was set nexttick,下一輪...

特殊情況下的一類約瑟夫問題

題幹資料全是隨機生成的,顯然可以暴力日過去。from oi wiki 考慮到我們每次走 k 個刪乙個,那麼在一圈以內我們可以刪掉 lfloor frac rfloor 個,然後剩下了 n lfloor frac rfloor 個人。這時我們在第 lfloor frac rfloor times k ...