事件物件也屬於核心物件,主要包括三個成員:使用計數;指定是自動重置事件還是人工重置事件的布林值;指定是已通知狀態還是未通知狀態的布林值。
//createevent函式建立乙個匿名或者命名的事件物件:
handle createevent
( lpsecurity_attributes lpeventattributes,
// 若為null,指定預設的安全性
bool bmanualreset,
// true為人工重置事件,否則自動重置事件
bool binitialstate,
// true有訊號狀態,否則是無訊號狀態
lpctstr lpname // 事件物件的名稱
);
//setevent函式將把指定的事件物件設定為有訊號狀態
bool setevent
( handle hevent // handle to event object
);
//resetevent函式把指定的事件物件設定為無訊號狀態
bool resetevent
( handle hevent // handle to event object
);
#include
#include
dword winapi fun1proc
(lpvoid lpparameter)
;dword winapi fun2proc
(lpvoid lpparameter)
;int tickets=
100;
handle g_hevent=
100;
void
main()
//執行緒1的入口函式
dword winapi fun1proc
(lpvoid lpparameter)
else
}return0;
}//執行緒2的入口函式
dword winapi fun2proc
(lpvoid lpparameter)
else
}return0;
}
//執行程式,發現並沒有完成車票銷售,原因就是建立事件物件時,第三個引數是false表示無訊號狀態。解決方法一就是將第三個引數設定為true;解決方法二就是在建立事件物件之後,加上setevent(g_hevent);再次執行程式會列印0號車票。
//其實為了實現執行緒間的同步,不應該使用人工重置的事件物件,而應該使用自動重置的事件物件,因此可以不用手動呼叫resetevent函式,因此解決方法如下:
#include
#include
dword winapi fun1proc
(lpvoid lpparameter)
;dword winapi fun2proc
(lpvoid lpparameter)
;int tickets=
100;
handle g_hevent;
void
main()
//執行緒1的入口函式
dword winapi fun1proc
(lpvoid lpparameter)
else
}return0;
}//執行緒2的入口函式
dword winapi fun2proc
(lpvoid lpparameter)
else
}return0;
}
//執行結果如圖。
//利用createevent函式建立命名物件並根據返回值判斷應用程式是否已經有乙個例項在執行。如果有程式退出。
g_hevent=
createevent
(null
,false,false,
null);
if(g_hevent)
setevent
(g_hevent)
;}
apue 第十六章 套接字
int socket int domain,int type,int protocal 返回套接字的檔案描述符 domain是套接字的通訊域,每個域都有不同的位址格式 af inet af inet6 af unix af upsec af address family 位址族 type是套接字型別...
執行緒同步和執行緒非同步 同步套接字非同步套接字
執行緒同步和執行緒非同步有什麼區別?重要基礎知識 打個比方,如果你在等乙個人,同步的時候,你會一直等到她來了之後才做其他事情,這個過程除了等待你啥都不會做,非同步的時候,你一邊在等,可能一邊玩遊戲或者是看報紙什麼的,一直到她到來,你的等待狀態才會結束 在實現上,同步的過程會阻塞程序的所有其他操作,將...
第十六章 執行緒棧
1 基礎 1 執行緒初始化時,執行緒棧預設1m,所有頁面都是page readwrite屬性,但只為前兩個頁面調撥了物理儲存器,位址低的那個頁面叫防護頁面,為其指定了page guard屬性 2 當執行緒訪問到防護頁面時,由於指定了page guard屬性,系統會得到通知,系統會為防護頁面的下乙個頁...