June 7, 2008
使用Event同步线程的小例子
在多线程编程中,有时候我们需要一个函数调用不是立即返回,而是在等待某个线程结束后再返回。要达到这个目的有很多种方法,这篇日志我只说一下使用 Event 的方法。
看一个小例子,在 main 函数中创建一个线程计算 1, 2, 3, ..., 100 的和并打印结果——由于这个计算的执行时间实在太短,所以让线程休眠 2 秒钟虚拟一个更加耗时的计算过程——等待线程结束后 main 函数返回。
源代码如下:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
HANDLE hThread = NULL;
HANDLE hEvent = NULL;
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
int s = 0;
for (int i = 1; i <= 100; i++)
s += i;
::Sleep(2000);
printf("%d\n", s);
::SetEvent(hEvent);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int sum = 0;
hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
hThread = ::CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
::WaitForSingleObject(hEvent, INFINITE); // 注释掉这一行
::CloseHandle(hThread);
::CloseHandle(hEvent);
return 0;
}
程序运行结果:
5050
如果我们不使用 Event 来同步线程能不能得到这个计算结果呢,修改上面的小例子,把 WaitForSingleObject 那一行注释掉再运行看看,由于这时 main 函数不再等待线程执行结束就已经返回,运行得不到正确的计算结果。^_^

zflaky at 19:15 Sep 24, 2008 ₪
你好,谢谢你这篇文章,我正在寻找这方面的资料。看到你的文中提到有多种方法,我手头有个小问题在做,方便给我一些指点吗,mail我。谢谢。