- #include<windows.h>
- #include<iostream>
- DWORD WINAPI fun1Proc(LPVOID lpParameter );
- DWORD WINAPI fun2Proc(LPVOID lpParameter );
- int tickets = 100;
- HANDLE hEvent;
- int main()
- {
- HANDLE hThread1;
- HANDLE hThread2;
- /*
- 创建一个事件对象(事件对象是内核对象)
- 参数一为NULL则指定返回的句柄不能被继承
- 参数二指定该事件是人工重置还是自动重置
- 当为人工重置时需要调用ResetEvent()使事件无信号,当调用SetReset()使之有信号时,
- 所有的等待线程将本释放;
- 当我自动重置时,WaitForSingleObject()后系统自动将其设置为无信号,需要用SetReset()将
- 其设置为有信号,这时一个线程被释放
- 参数三指定事件的初始状态,为true时初始为有信号状态
- 参数四指定事件名
- */
- hEvent = CreateEvent(NULL,false,true,NULL);
- hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);
- hThread1 =CreateThread(NULL,0,fun2Proc,NULL,0,NULL);
- CloseHandle(hThread1);
- CloseHandle(hThread2);
- ReleaseMutex(hEvent);
- Sleep(4000);
- return 0;
- }
- DWORD WINAPI fun1Proc(LPVOID lpParameter )
- {
- while(true)
- {
- WaitForSingleObject(hEvent,INFINITE);
- //ResetEvent(hEvent);
- if(tickets>0)
- {
- std::cout<<"thread1 sell ticket "<<tickets--<<std::endl;
- }
- else
- {
- break;
- }
- SetEvent(hEvent);
- }
- return 0;
- }
- DWORD WINAPI fun2Proc(LPVOID lpParameter )
- {
- while(true)
- {
- WaitForSingleObject(hEvent,INFINITE);
- //ResetEvent(hEvent);
- if(tickets>0)
- {
- std::cout<<"thread2 sell ticket "<<tickets--<<std::endl;
- }
- else
- {
- break;
- }
- SetEvent(hEvent);
- }
- return 0;
- }
用事件同步多线程
最新推荐文章于 2016-11-10 15:33:02 发布