参考链接:
http://blog.youkuaiyun.com/morewindows/article/details/7445233
#include "stdio.h"
#include <windows.h>
#include <iostream>
using namespace std;
int tickets = 100;
HANDLE g_hEvent;
DWORD WINAPI ThreadProc1(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);
int main()
{
g_hEvent = CreateEvent( NULL, // 安全控制,一般直接传入NULL。
FALSE, // 确定事件是手动置位还是自动置位,传入TRUE表示手动置位,传入FALSE表示自动置位。
FALSE, // 事件的初始状态,传入TRUE表示已触发。
NULL); // 事件的名称,传入NULL表示匿名事件。
HANDLE handle1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
HANDLE handle2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);
// 事件初始化为未触发状态,在创建两个线
// 程后两个线程都停在WaitForSingleObject
// 那里,需要SetEvent事件才能让WaitForSingleObject
// 获取事件
SetEvent(g_hEvent);
while(1);
}
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
while(TRUE)
{
WaitForSingleObject(g_hEvent, INFINITE); // 事件初始化为自动置位,表示等到事件的时候就默认ResetEvent了事件
/*printf("ThreadProc1 get Event\n");
ResetEvent(g_hEvent);
while(1);*/
if(tickets > 0)
{
Sleep(1);
cout << "Thread1 sell ticket:" << tickets-- << endl;
SetEvent(g_hEvent);
}
else
{
SetEvent(g_hEvent);
break;
}
}
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
while(TRUE)
{
WaitForSingleObject(g_hEvent, INFINITE);
/*printf("ThreadProc2 get Event\n");
ResetEvent(g_hEvent);
while(1);*/
if(tickets > 0)
{
Sleep(1);
cout << "Thread2 sell ticket:" << tickets-- << endl;
SetEvent(g_hEvent);
}
else
{
SetEvent(g_hEvent);
break;
}
}
return 0;
}
本文展示了一个使用Windows API创建线程并通过事件进行同步的例子。两个线程共享一个票数资源,通过事件来协调彼此的工作,确保每次只有一个线程能够执行售票操作。
1538

被折叠的 条评论
为什么被折叠?



