1.使用互斥量与事件对象实现线程同步的例子代码: #include <Windows.h> #include <iostream> using namespace std; DWORD WINAPI Fun1Proc_dd(LPVOID lpParameter); DWORD WINAPI Fun2Proc_dd(LPVOID lpParameter); int index = 0; int tickets_dd = 100; HANDLE hMutex; HANDLE hEvent; void main_dd(int argc, char **argv) { HANDLE hThread1; HANDLE hThread2; //互斥量 /*hMutex = CreateMutex(NULL, FALSE, "test"); if (hMutex) { if (ERROR_ALREADY_EXISTS == GetLastError()) { cout << "only one instance can run!" << endl; return; } }*/ hEvent = CreateEvent(NULL, FALSE, TRUE, NULL); if (hEvent) { if (ERROR_ALREADY_EXISTS == GetLastError()) { cout << "Only one instance can run!" << endl; return; } } hThread1 = CreateThread(NULL, 0, Fun1Proc_dd, NULL, 0, NULL); hThread2 = CreateThread(NULL, 0, Fun2Proc_dd, NULL, 0, NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(4000); return; } DWORD WINAPI Fun1Proc_dd(LPVOID lpParameter) { //互斥量 //WaitForSingleObject(hMutex, INFINITE); //事件对象 WaitForSingleObject(hEvent, INFINITE); while (TRUE) { if (tickets_dd > 0) { Sleep(1); cout << "thread1_dd sell ticket: " << tickets_dd-- << endl; //设置事件对象为有信号状态 SetEvent(hEvent); } else { SetEvent(hEvent); break; } //ReleaseMutex(hMutex); } return 0; } DWORD WINAPI Fun2Proc_dd(LPVOID lpParameter) { //互斥量 //WaitForSingleObject(hMutex, INFINITE); WaitForSingleObject(hEvent, INFINITE); while (TRUE) { if (tickets_dd > 0) { Sleep(1); cout << "thread2_dd sell ticket: " << tickets_dd-- << endl; SetEvent(hEvent); } else { SetEvent(hEvent); break; } //ReleaseMutex(hMutex); } return 0; } 2.使用关键代码段实现线程同步的例子代码: #include <Windows.h> #include <iostream> using namespace std; DWORD WINAPI Fun1Proc(LPVOID lParameter); DWORD WINAPI Fun2Proc(LPVOID lParameter); CRITICAL_SECTION g_cs; int tickets = 100; int 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_cs); Sleep(4000); //使用完毕删除关键代码段 DeleteCriticalSection(&g_cs); return 0; } DWORD WINAPI Fun1Proc(LPVOID lParameter) { while (TRUE) { //进入关键代码段,如果被人占用则一直等待 EnterCriticalSection(&g_cs); Sleep(1); if (tickets > 0) { cout << "thread1 sell ticket : " << tickets-- << endl; //离开关键代码段 LeaveCriticalSection(&g_cs); } else { LeaveCriticalSection(&g_cs); break; } } return 0; } DWORD WINAPI Fun2Proc(LPVOID lParameter) { while (TRUE) { EnterCriticalSection(&g_cs); Sleep(1); if (tickets > 0) { cout << "thread2 sell ticket : " << tickets-- << endl; LeaveCriticalSection(&g_cs); } else { LeaveCriticalSection(&g_cs); break; } } return 0; }