首選使用臨界區(qū)對(duì)象,主要原因是使用簡(jiǎn)單。
#include <iostream> using namespace std; DWORD WINAPI Fun1Proc(LPVOID lpParameter); DWORD WINAPI Fun2Proc(LPVOID lpParameter); int tickets=100; CRITICAL_SECTION g_csA; CRITICAL_SECTION g_csB; void main() { HANDLE hThread1; HANDLE hThread2; hThread1=CreateThread(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(40000); DeleteCriticalSection(&g_csA); DeleteCriticalSection(&g_csB); } DWORD WINAPI Fun1Proc(LPVOID lpParameter) { while (TRUE) { EnterCriticalSection(&g_csA); Sleep(1); //EnterCriticalSection(&g_csB);//臨界區(qū)的同步和互鎖 if (tickets>0) { Sleep(1); cout<<"Thread1 sell ticket :"<<tickets--<<endl; //LeaveCriticalSection(&g_csB); LeaveCriticalSection(&g_csA); } else { //LeaveCriticalSection(&g_csB); LeaveCriticalSection(&g_csA); break; } } return 0; } DWORD WINAPI Fun2Proc(LPVOID lpParameter) { while (TRUE) { EnterCriticalSection(&g_csB); Sleep(1); EnterCriticalSection(&g_csA); if (tickets>0) { Sleep(1); cout<<"Thread2 sell ticket :"<<tickets--<<endl; LeaveCriticalSection(&g_csA); LeaveCriticalSection(&g_csB); } else { LeaveCriticalSection(&g_csA); LeaveCriticalSection(&g_csB); break; } } return 0; }
二、使用互斥對(duì)象 #include <windows.h> #include <iostream> using namespace std; DWORD WINAPI Fun1Proc(LPVOID lpParameter); DWORD WINAPI Fun2Proc(LPVOID lpParameter); int index =0; int tickets=100; HANDLE hMutex; void main() { HANDLE hThread1; HANDLE hThread2; //創(chuàng)建線程 hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); //************************************************************** //保證應(yīng)用程序只有一個(gè)實(shí)例運(yùn)行,創(chuàng)建一個(gè)命名的互斥對(duì)象. hMutex=CreateMutex(NULL,TRUE,LPCTSTR("tickets")); //創(chuàng)建時(shí)主線程擁有該互斥對(duì)象,互斥對(duì)象的線程ID為主線程的ID,同時(shí)將該互斥對(duì)象內(nèi)部計(jì)數(shù)器置為1 if (hMutex) { if (ERROR_ALREADY_EXISTS==GetLastError()) { cout<<"only one instance can run!"<<endl; //Sleep(40000); return; } } //************************************************************** WaitForSingleObject(hMutex,INFINITE); //使用該函數(shù)請(qǐng)求互斥對(duì)象時(shí),雖說(shuō)該對(duì)象處于無(wú)信號(hào)狀態(tài),但因?yàn)檎?qǐng)求的線程ID和該互斥對(duì)象所有者的線程ID是相同的.所以仍然可以請(qǐng)求到這個(gè)互斥對(duì)象,于是該互斥對(duì)象內(nèi)部計(jì)數(shù)器加1,內(nèi)部計(jì)數(shù)器的值為2. 意思是有兩個(gè)等待動(dòng)作 ReleaseMutex(hMutex);//釋放一次互斥對(duì)象,該互斥對(duì)象內(nèi)部計(jì)數(shù)器的值遞減1,操作系統(tǒng)不會(huì)將這個(gè)互斥對(duì)象變?yōu)橐淹ㄖ獱顟B(tài). ReleaseMutex(hMutex);//釋放一次互斥對(duì)象,該互斥對(duì)象內(nèi)部計(jì)數(shù)器的值為0,同時(shí)將該對(duì)象設(shè)置為已通知狀態(tài). //對(duì)于互斥對(duì)象來(lái)說(shuō),誰(shuí)擁有誰(shuí)釋放 Sleep(40000); } DWORD WINAPI Fun1Proc(LPVOID lpParameter) { while (TRUE) { WaitForSingleObject(hMutex,INFINITE);//等待互斥對(duì)象有信號(hào) if (tickets>0) { Sleep(1); cout<<"thread1 sell ticket :"<<tickets--<<endl; } else break; ReleaseMutex(hMutex);//設(shè)置該互斥對(duì)象的線程ID為0,并且將該對(duì)象設(shè)置為有信號(hào)狀態(tài) } return 0; } DWORD WINAPI Fun2Proc(LPVOID lpParameter) { while (TRUE) { WaitForSingleObject(hMutex,INFINITE); if (tickets>0) { Sleep(1); cout<<"thread2 sell ticket :"<<tickets--<<endl; } else break; ReleaseMutex(hMutex); } return 0;
三、使用事件對(duì)象 #include <windows.h> void main() Sleep(40000); DWORD WINAPI Fun1Proc(LPVOID lpParameter) DWORD WINAPI Fun2Proc(LPVOID lpParameter) |
聯(lián)系客服