使用Event同步线程的小例子

来源:互联网 发布:电子书阅读小软件 编辑:程序博客网 时间:2024/05/16 17:55

使用Event同步线程的小例子

在多线程编程中,有时候我们需要一个函数调用不是立即返回,而是在等待某个线程结束后再返回。要达到这个目的有很多种方法,这篇日志我只说一下使用 Event 的方法。

看一个小例子,在 main 函数中创建一个线程计算 1, 2, 3,..., 100 的和并打印结果——由于这个计算的执行时间实在太短,所以让线程休眠 2 秒钟虚拟一个更加耗时的计算过程——等待线程结束后 main 函数返回。

源代码如下:

#include"stdafx.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

HANDLE hThread = NULL;
HANDLE hEvent = NULL;

DWORD WINAPI ThreadProc(LPVOIDlpParam)
{
    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 函数不再等待线程执行结束就已经返回,运行得不到正确的计算结果。