事件对象在创建的时候要注意设置成手动reset还是自动reset。
手动的话就要自己在申请资源后标记,但是这样会存在一定问题,还是有可能在reset前轮转到另一线程:
- //
- // CopyRight(c) 2009, YOYO, All Rights Reserved.
- // Author: LIN YiQian
- // Created: 2009/09/16
- // Describe: 手动重置事件对象
- //
- #include <Windows.h>
- #include <iostream>
- using namespace std;
- DWORD WINAPI SellTickets(LPVOID lpParameter);
- int g_nTickets = 100;
- HANDLE g_hEvent;
- void main(void)
- {
- g_hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
- HANDLE hThread1 = CreateThread(NULL, 0, SellTickets, new int(1), 0, NULL);
- HANDLE hThread2 = CreateThread(NULL, 0, SellTickets, new int(2), 0, NULL);
- HANDLE hThread3 = CreateThread(NULL, 0, SellTickets, new int(3), 0, NULL);
- CloseHandle(hThread1);
- CloseHandle(hThread2);
- CloseHandle(hThread3);
- CloseHandle(g_hEvent);
- system("pause");
- return;
- }
- DWORD WINAPI SellTickets(LPVOID lpParameter)
- {
- while (true)
- {
- WaitForSingleObject(g_hEvent, INFINITE);
- ResetEvent(g_hEvent);
- if (g_nTickets > 0)
- {
- printf("Thread %d sells tickets: %d/n", *((int*) lpParameter), g_nTickets--);
- }
- else
- {
- break;
- }
- SetEvent(g_hEvent);
- }
- return NULL;
- }
自动的话 在申请到资源的同时会自动reset ^^
- //
- // CopyRight(c) 2009, YOYO, All Rights Reserved.
- // Author: LIN YiQian
- // Created: 2009/09/16
- // Describe: 自动重置事件对象 演示
- //
- #include <Windows.h>
- #include <iostream>
- using namespace std;
- DWORD WINAPI SellTickets(LPVOID lpParameter);
- int g_nTickets = 100;
- HANDLE g_hEvent;
- void main(void)
- {
- g_hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
- HANDLE hThread1 = CreateThread(NULL, 0, SellTickets, new int(1), 0, NULL);
- HANDLE hThread2 = CreateThread(NULL, 0, SellTickets, new int(2), 0, NULL);
- HANDLE hThread3 = CreateThread(NULL, 0, SellTickets, new int(3), 0, NULL);
- CloseHandle(hThread1);
- CloseHandle(hThread2);
- CloseHandle(hThread3);
- Sleep(1000);
- CloseHandle(g_hEvent);
- system("pause");
- return;
- }
- DWORD WINAPI SellTickets(LPVOID lpParameter)
- {
- while (true)
- {
- WaitForSingleObject(g_hEvent, INFINITE);
- if (g_nTickets > 0)
- {
- printf("Thread %d sells ticket: No.%d/n", *((int*) lpParameter), g_nTickets--);
- }
- else
- {
- break;
- }
- SetEvent(g_hEvent);
- }
- return NULL;
- }