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; }