無鎖環形佇列的設計及示例,讀寫佇列最大的應用是:乙個執行緒收到事件或訊息後直接
加入到佇列,而處理執行緒讀取佇列中的事件或訊息,並加以處理。在這個模式中,有乙個線
程負責寫,多個處理執行緒讀自己的佇列並處理。雖然看起來象是一寫多讀,其實不然,針對
某一事件佇列而言,只有乙個執行緒是寫乙個執行緒是讀。
環形一讀一寫佇列中,不需要擔心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 ...