线程同步的三种方法(互斥,事件,临界区) 之三 使用事件对象
2007-12-12 10:19
483 查看
#include <windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int tickets=100;
HANDLE g_hEvent;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
//**************************************************
//创建一个命名的自动重置事件内核对象
g_hEvent=CreateEvent(NULL,FALSE,FALSE,LPCWSTR("tickets"));
if (g_hEvent)
{
if (ERROR_ALREADY_EXISTS==GetLastError())
{
cout<<"only one instance can run!"<<endl;
return;
}
}
//**************************************************
SetEvent(g_hEvent);
//创建线程
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
Sleep(40000);
//关闭事件对象句柄
CloseHandle(g_hEvent);
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(g_hEvent,INFINITE);
//ResetEvent(g_hEvent);
if (tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket :"<<tickets--<<endl;
SetEvent(g_hEvent);
}
else
{
SetEvent(g_hEvent);
break;
}
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(g_hEvent,INFINITE);
//ResetEvent(g_hEvent);
if (tickets>0)
{
cout<<"Thread2 sell ticket :"<<tickets--<<endl;
SetEvent(g_hEvent);
}
else
{
SetEvent(g_hEvent);
break;
}
}
return 0;
}
相关文章推荐
- 线程同步的三种方法(互斥,事件,临界区) 之一 使用临界区对象
- 线程同步的三种方法(互斥,事件,临界区) 之二 使用互斥对象
- VC下线程同步的三种方法(互斥、事件、临界区)
- VC下线程同步的三种方法(互斥、事件、临界区) - pl2597758的专栏 - CSDNBlog
- VC下线程同步的三种方法(互斥、事件、临界区)
- VC下线程同步的三种方法(互斥、事件、临界区)
- VC下线程同步的三种方法(互斥、事件、临界区)
- VC下线程同步的三种方法(互斥、事件、临界区)
- VC下线程同步的三种方法(互斥、事件、临界区)/(转)
- VC下线程同步的三种方法(互斥、事件、临界区)
- 多线程同步的三种方法-互斥量-事件对象-关键代码段(临界区)
- 线程的创建、管理 与 使用信号灯、互斥量、临界区、事件进行线程同步或互斥
- 线程同步与临界区对象、互斥对象、事件对象
- 互斥对象,事件对象,临界区的使用比较
- js跨浏览器的事件侦听器和事件对象的使用方法
- JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
- jQuery的三种bind/One/Live事件绑定使用方法
- 下面的示例演示如何使用传递到事件处理方法的 GridViewCommandEventArgs 对象确定引发事件的按钮的命令名。
- *Delphi多线程编程--线程同步的方法(事件、互斥、信号、计时器)简介
- JavaScript call apply使用——JavaScript对象的方法绑定到DOM事件后this指向问题