1.利用互斥事件实现线程间同步 #include <iostream.h> #include <windows.h> DWORD WINAPI ThreadProc1(LPVOID lpParameter); DWORD WINAPI ThreadProc2(LPVOID lpParameter); int tickets=100; HANDLE g_hEvent; void main() { DWORD ThredId; HANDLE hThread1; HANDLE hThread2; g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); SetEvent(g_hEvent); hThread1=CreateThread(NULL,0,ThreadProc1,0,0,&ThredId); hThread2=CreateThread(NULL,0,ThreadProc2,0,0,&ThredId); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(4000); CloseHandle(g_hEvent); } DWORD WINAPI ThreadProc1(LPVOID lpParameter) { while(true) { WaitForSingleObject(g_hEvent,INFINITE); //ResetEvent(g_hEvent); if(tickets>0) { Sleep(1); cout<<"thread1 sell ticket: "<<tickets--<<endl; } else { break; } SetEvent(g_hEvent); } return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { while(true) { WaitForSingleObject(g_hEvent,INFINITE); //ResetEvent(g_hEvent); if(tickets>0) { Sleep(1); cout<<"thread2 sell ticket: "<<tickets--<<endl; } else { break; } SetEvent(g_hEvent); } return 0; } 2.利用互斥对象实现线程间同步 #include <iostream.h> #include <windows.h> DWORD WINAPI ThreadProc1(LPVOID lpParameter); DWORD WINAPI ThreadProc2(LPVOID lpParameter); int tickets=100; HANDLE hMutex; void main() { DWORD ThredId; HANDLE hThread1; HANDLE hThread2; hThread1=CreateThread(NULL,0,ThreadProc1,0,0,&ThredId); hThread2=CreateThread(NULL,0,ThreadProc2,0,0,&ThredId); CloseHandle(hThread1); CloseHandle(hThread2); hMutex=CreateMutex(NULL,FALSE,"Mutex"); Sleep(4000); } DWORD WINAPI ThreadProc1(LPVOID lpParameter) { while(true) { WaitForSingleObject(hMutex,INFINITE); if(tickets>0) { Sleep(1); cout<<"thread1 sell ticket: "<<tickets--<<endl; } else break; ReleaseMutex (hMutex); } return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { while(true) { WaitForSingleObject(hMutex,INFINITE); if(tickets>0) { Sleep(1); cout<<"thread2 sell ticket: "<<tickets--<<endl; } else break; ReleaseMutex (hMutex); } return 0; } 2.利用临界区实现线程间同步 #include <iostream.h> #include <windows.h> DWORD WINAPI ThreadProc1(LPVOID lpParameter); DWORD WINAPI ThreadProc2(LPVOID lpParameter); int tickets=100; CRITICAL_SECTION CriticalSection; void main() { DWORD ThredId; HANDLE hThread1; HANDLE hThread2; InitializeCriticalSection(&CriticalSection); hThread1=CreateThread(NULL,0,ThreadProc1,0,0,&ThredId); hThread2=CreateThread(NULL,0,ThreadProc2,0,0,&ThredId); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(4000); DeleteCriticalSection(&CriticalSection); } DWORD WINAPI ThreadProc1(LPVOID lpParameter) { while(true) { EnterCriticalSection(&CriticalSection); if(tickets>0) { Sleep(1); cout<<"thread1 sell ticket: "<<tickets--<<endl; } else { break; } LeaveCriticalSection(&CriticalSection); } return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { while(true) { EnterCriticalSection(&CriticalSection); if(tickets>0) { Sleep(1); cout<<"thread2 sell ticket: "<<tickets--<<endl; } else { break; } LeaveCriticalSection(&CriticalSection); } return 0; }