互斥量mutex 與 互斥量cs 中,執行緒的編號,也就是i是在主線程中1的,但是子執行緒裡列印出的 i 卻非常混亂,因為主線程裡的寫操作 和子執行緒裡的讀操作是同時進行的,這個有點像資料庫裡的事物,寫操作分為三個步驟,從記憶體中讀取i的值放入暫存器,第二步在暫存器裡加1,第三步寫回記憶體,而子執行緒裡的讀都是從記憶體中讀取的,可是這個時候,對i的加1操作可能已經進行了好幾次了,子執行緒讀到的i值根本不是當初生成它時候的那個值,說的普通點,你是乙個子執行緒,住在南極,主線程住在北極,北極有一顆樹,如今10歲了,也就是說它的年輪是10圈。主線程說你來吧,讀取這顆樹的年輪,這時你從南極前往北極,可是路途遙遠,整整走了10年,於是你到達後讀取年輪時發現居然是20圈,等你回到南極,又過了10年,你對身邊的小夥伴說,北極有一顆樹,年輪是20圈,但那是你讀的時候,而今已經30圈了。
互斥量和cs由於有執行緒所有權這個特質,所以只能用於做執行緒之間的互斥,但是沒辦法做執行緒間的同步,想要做同步,需要使用事件和訊號量,今天先說說事件
其實使用起來非常簡單
#include #include #include #include"lock.h"
#include"wintree.h"
#include"a.h"
using namespace std;
int gnum;
unsigned int __stdcall threadwrite(void *p);
crisection cs;
handle g_hthreadevent;
int main(){
const int icount = 50;
handle handle[icount];
gnum = 0;
g_hthreadevent = createevent(null,false,false,null);
// 建立50個執行緒,每個執行緒中都會列印i
for(int i = 0;i
主線程裡想要給i加1,但是子執行緒說您先別著急,等我讀取完了你再加,於是子執行緒先讀取i的值,然後setevent,告訴主線程,ok,我已經讀取完畢,你可以加1了,主線程一直在wait,終於等到了事件的觸發,然後對i進行加1,這樣一來,主線程在加1前,會先確定子執行緒是不是已經讀取結束,如此,每個子執行緒都會獲得屬於自己的那個i
VS2015 多執行緒同步 Event
在 vc 深入詳解 多執行緒原始碼上做了修訂,因為若在vs2015上跑原書 效果並不明顯,可能很多人從而對書本產生質疑。cpu從以前的偽多執行緒進入真正的多執行緒時代,這些是書本作者 孫鑫 沒考慮到的。上 原書開了2個執行緒,效果遠遠不如4個執行緒明顯 setevent 讓事件有訊號,這樣waitf...
c 中的多執行緒同步
在處理多執行緒同步問題的時候,我們一般有臨界區,互斥量,訊號量和訊息機制等幾種解決方案,在c 中可以非常方便的使用它們來實現程序的同步。下面我就常用的lock,monitor和mutex幾種來說明如何實現程序的同步。lock和monitor依靠一種 令牌 物件來實現程序的同步,下面看一段示範 cla...
使用Event同步執行緒
win32寫多執行緒的時候經常需要執行緒同步,同步的方法很多,效率也不一樣,這裡介紹一種event同步物件。建立乙個mfc基於dialog的工程,介面如圖 執行緒部分 全部為全域性變數和函式 const int max thread 3 handle hevent null handle to ev...