您的位置:首页 > 其它

多线程火车票售票系统——自动重置事件对象实现线程同步

2013-04-04 00:41 453 查看
#include <windows.h>

#include <iostream.h>

DWORD WINAPI Fun1Proc(LPVOID lpParameter);

DWORD WINAPI Fun2Proc(LPVOID lpParameter);

int index = 0;

int tickets = 100;

HANDLE g_hEvent; //全局事件对象句柄 如果是进程间,必须用命名的方式,在另外一个进程中,用openevent打开同一个名字的event,返回一个句柄来操作。

void 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);

g_hEvent = CreateEvent(NULL,false,false,NULL); //创建事件对象,第二个参数为false,表示自动重置的。第三个参数false,表示事件对象初始值为无信号。第四个参数NULL,表示匿名的。

SetEvent(g_hEvent); //设置为有信号状态

Sleep(4000); //让主线程放弃执行,不退出。进入等待状态,不占用CPU。

return;

}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)

{

while (TRUE)

{

WaitForSingleObject(g_hEvent,INFINITE);//请求事件对象。如果为0,则不会死等,不管有没有信号,都会执行后面的代码。

if (tickets > 0)

{

Sleep(1);

cout<<"thread1 sell tickets:"<<tickets--<<endl;

SetEvent(g_hEvent);

}

else

{

SetEvent(g_hEvent);

break;

}

}

return 0;

}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)

{

while (TRUE)

{

WaitForSingleObject(g_hEvent,INFINITE);//请求事件对象。

if (tickets > 0)

{

Sleep(1);

cout<<"thread2 sell tickets:"<<tickets--<<endl;

SetEvent(g_hEvent);

}

else

{

SetEvent(g_hEvent);

break;

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: