1. 利用Mutex 互斥對象
#include <iostream.h><br />#include <windows.h><br />DWORD WINAPI Fun1Proc(<br />LPVOID lpParameter<br />);<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />);<br />int tickets = 100;<br />HANDLE hMutex; //互斥對象<br />int main()<br />{<br />HANDLE hThread1,hThread2;<br />hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);<br />hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);<br /> CloseHandle(hThread1);<br />CloseHandle(hThread2);<br />hMutex = CreateMutex(NULL,FALSE,NULL);</p><p>Sleep(8000);<br />return 1;<br />}<br />DWORD WINAPI Fun1Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />WaitForSingleObject(hMutex,INFINITE); //有訊號時才返回<br />if(0 == tickets)<br />break;<br />cout<<"Thread1 sell tickets "<<tickets--<<endl;<br />ReleaseMutex(hMutex);//釋放互斥對象<br />}<br />return 0;<br />}<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />WaitForSingleObject(hMutex,INFINITE);<br />if(0 == tickets)<br />break;<br />cout<<"Thread2 sell tickets "<<tickets--<<endl;<br />ReleaseMutex(hMutex);//釋放互斥對象<br />}<br />return 0;<br />}
2. 利用Event 事件對象
#include <iostream.h><br />#include <windows.h><br />DWORD WINAPI Fun1Proc(<br />LPVOID lpParameter<br />);<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />);<br />int tickets = 100;<br />HANDLE hEvent; //事件<br />int main()<br />{<br />hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); //建立事件<br />SetEvent(hEvent);//設定成有訊號狀態<br />HANDLE hThread1,hThread2;<br />hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);<br />hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);<br /> CloseHandle(hThread1);<br />CloseHandle(hThread2);</p><p>Sleep(8000);<br />return 1;<br />}<br />DWORD WINAPI Fun1Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />WaitForSingleObject(hEvent,INFINITE); //事件有訊號才返回<br />ResetEvent(hEvent); //設成無訊號,以免其餘線程訪問<br />if(0 == tickets)<br />break;<br />cout<<"Thread1 sell tickets "<<tickets--<<endl;<br />SetEvent(hEvent);//設為有訊號,以供其餘線程調用<br />}<br />return 0;<br />}<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />WaitForSingleObject(hEvent,INFINITE); //事件有訊號才返回<br />ResetEvent(hEvent); //設成無訊號,以免其餘線程訪問<br />if(0 == tickets)<br />break;<br />cout<<"Thread2 sell tickets "<<tickets--<<endl;<br />SetEvent(hEvent);//設為有訊號,以供其餘線程調用<br />}<br />return 0;<br />}
3. 利用臨界區 CRITICAL_SECTION 效率更高
#include <iostream.h><br />#include <windows.h></p><p>DWORD WINAPI Fun1Proc(<br />LPVOID lpParameter<br />);<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />);</p><p>int tickets = 100;<br />CRITICAL_SECTION cs;//臨界區<br />int main()<br />{<br />InitializeCriticalSection(&cs); //初始化臨界區</p><p>HANDLE hThread1,hThread2;<br />hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);<br />hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);<br /> CloseHandle(hThread1);<br />CloseHandle(hThread2);</p><p>Sleep(8000);<br />return 1;<br />}</p><p>DWORD WINAPI Fun1Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />EnterCriticalSection(&cs); //進入臨界區</p><p>if(0 == tickets)<br />break;<br />cout<<"Thread1 sell tickets "<<tickets--<<endl;</p><p>LeaveCriticalSection(&cs); //離開臨界區<br />}<br />return 0;<br />}<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />EnterCriticalSection(&cs); //進入臨界區</p><p>if(0 == tickets)<br />break;<br />cout<<"Thread2 sell tickets "<<tickets--<<endl;</p><p>LeaveCriticalSection(&cs); //離開臨界區<br />}<br />return 0;<br />}
4. 利用Semaphore訊號量
/** FileName: Semaphore_Test.cpp * Author: JarvisChu* Date: 2012-11-22*///#include <iostream>#include <iostream>#include <windows.h>using namespace std;DWORD WINAPI Fun1Proc(LPVOID lpParameter);DWORD WINAPI Fun2Proc(LPVOID lpParameter);DWORD WINAPI Fun3Proc(LPVOID lpParameter);volatile int tickets = 100;HANDLE hSemaphore;int main(){//必須先Create Semaphore 然後CreateThreadhSemaphore = CreateSemaphore(NULL,1,//初始資源數 互斥的情況下必須為1 3,//最大資源數,互斥的情況下意義不大NULL //Unnameed semaphore);if(hSemaphore == NULL) cout<<"Create Semaphore Failed!"<<endl;HANDLE hThread1,hThread2,hThread3;hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);hThread3 = CreateThread(NULL,0,Fun3Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);CloseHandle(hThread3);Sleep(800);return 0;}DWORD WINAPI Fun1Proc(LPVOID lpParameter){while (TRUE){DWORD nWaitResult;nWaitResult = WaitForSingleObject(hSemaphore,INFINITE);if(tickets >0)cout<<"Thread1 Sailed ticket "<<tickets--<<endl;elsebreak;ReleaseSemaphore(hSemaphore,1,NULL);}return 0;}DWORD WINAPI Fun2Proc(LPVOID lpParameter){while (TRUE){DWORD nWaitResult;nWaitResult = WaitForSingleObject(hSemaphore,INFINITE);if(tickets >0)cout<<"Thread2 Sailed ticket "<<tickets--<<endl;elsebreak;ReleaseSemaphore(hSemaphore,1,NULL);}return 0;}DWORD WINAPI Fun3Proc(LPVOID lpParameter){while (TRUE){DWORD nWaitResult;nWaitResult = WaitForSingleObject(hSemaphore,INFINITE);if(tickets >0)cout<<"Thread3 Sailed ticket "<<tickets--<<endl;elsebreak;ReleaseSemaphore(hSemaphore,1,NULL);}return 0;}