1. 利用Mutex 互斥对象
#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; HANDLE hMutex; //互斥对象 int main() { HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); hMutex = CreateMutex(NULL,FALSE,NULL); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hMutex,INFINITE); //有信号时才返回 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; ReleaseMutex(hMutex);//释放互斥对象 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hMutex,INFINITE); if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; ReleaseMutex(hMutex);//释放互斥对象 } return 0; }
2. 利用Event 事件对象
#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; HANDLE hEvent; //事件 int main() { hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); //创建事件 SetEvent(hEvent);//设置成有信号状态 HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hEvent,INFINITE); //事件有信号才返回 ResetEvent(hEvent); //设成无信号,以免其余线程访问 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; SetEvent(hEvent);//设为有信号,以供其余线程调用 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hEvent,INFINITE); //事件有信号才返回 ResetEvent(hEvent); //设成无信号,以免其余线程访问 if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; SetEvent(hEvent);//设为有信号,以供其余线程调用 } return 0; }
3. 利用临界区 CRITICAL_SECTION 效率更高
#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; CRITICAL_SECTION cs;//临界区 int main() { InitializeCriticalSection(&cs); //初始化临界区 HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ EnterCriticalSection(&cs); //进入临界区 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; LeaveCriticalSection(&cs); //离开临界区 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ EnterCriticalSection(&cs); //进入临界区 if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; LeaveCriticalSection(&cs); //离开临界区 } return 0; }
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 然后CreateThread hSemaphore = 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; else break; 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; else break; 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; else break; ReleaseSemaphore(hSemaphore,1,NULL); } return 0; }