《线程同步与异步套接字.doc》由会员分享,可在线阅读,更多相关《线程同步与异步套接字.doc(12页珍藏版)》请在金锄头文库上搜索。
1、线程同步与异步套接字编程1.利用事件对象来实现线程间的同步新建一个win32 console application,取名Event,再建一个Event源文件,编辑:#include#includeDWORDWINAPIFun1Proc(LPVOIDlpParameter);DWORDWINAPIFun2Proc(LPVOIDlpParameter);inttickets=100;HANDLEg_hEvent;voidmain()HANDLEhThread1;HANDLEhThread2;hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hT
2、hread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);/g_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);/创建一个匿名的有信号状态的事件对象/g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);/创建一个匿名的无信号状态的事件对象g_hEvent=CreateEvent(NULL,FALSE,FALSE,tickets);/创建一个命名的无信号状态的事件对象SetEvent(g_hEvent
3、);/将事件对象设置为有信号状态if(g_hEvent)if(ERROR_ALREADY_EXISTS=GetLastError()coutonlyoneinstancecanrun!0)Sleep(1);SetEvent(g_hEvent);coutthread1sellticket:tickets-0)Sleep(1);SetEvent(g_hEvent);coutthread2sellticket:tickets-endl;elseSetEvent(g_hEvent);/将事件对象设为有信号状态break;return0;2.利用CriticalSection实现线程同步#include
4、#includeDWORDWINAPIFun1Proc(LPVOIDlpParameter);DWORDWINAPIFun2Proc(LPVOIDlpParameter);inttickets=100;CRITICAL_SECTIONg_cs;/定义一个全局的临界区对象voidmain()HANDLEhThread1;HANDLEhThread2;hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);C
5、loseHandle(hThread2);InitializeCriticalSection(&g_cs);/初始化一个临界区对象Sleep(4000);DeleteCriticalSection(&g_cs);/释放这个临界区对象DWORDWINAPIFun1Proc(LPVOIDlpParameter/threaddata)while(TRUE)EnterCriticalSection(&g_cs);/获得临界区的所有权,进入临界区if(tickets0)Sleep(1);coutthread1sellticket:tickets-0)Sleep(1);coutthread2selltic
6、ket:tickets-endl;elsebreak;LeaveCriticalSection(&g_cs);/离开临界区,并释放所有权return0;3.线程死锁#include#includeDWORDWINAPIFun1Proc(LPVOIDlpParameter);DWORDWINAPIFun2Proc(LPVOIDlpParameter);inttickets=100;CRITICAL_SECTIONg_csA;/定义一个全局的临界区对象CRITICAL_SECTIONg_csB;voidmain()HANDLEhThread1;HANDLEhThread2;hThread1=Cre
7、ateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);InitializeCriticalSection(&g_csA);/初始化一个临界区对象InitializeCriticalSection(&g_csB);Sleep(4000);DeleteCriticalSection(&g_csA);/释放这个临界区对象DeleteCriticalSection(&g_csB);DWORDWINAPIFun1Proc(LPVOIDlpParameter/threaddata)while(TRUE)EnterCriticalSection(&g_csA);/获得临界区的所有权,进入临界区Sleep(1);EnterCriticalSection(&g_csB);if(tickets0)Sleep(1);coutthread1sellticket:tickets-0)