canmeng50401的专栏

统计

留言簿

阅读排行榜

评论排行榜

使用 event object 来进行线程间的同步

        用户态使用createEvent()来创建并初始化一个event object。
        内核态使用KEVENT类型来创建一个event object,使用KeInitializeEventObject()来初始化一个event object。
        一个event object有两种状态:nonsignaled和signaled。使用ResetEvent()函数将event object的状态设置为nonsignaled。使用SetEvent()函数将event object的状态设置为signaled。
        WaitForSingleObject()函数的参数是一个event object,当这个event object的状态为nonsignaled状态时,此函数会一直等待,一直到这个event object的状态变化为signaled,函数才会返回。WaitForMultipleObjects()函数的第三个参数是一个bool型变量,当为true的时候,那么等待的那几个event object的状态全部为signaled的时候,函数才返回;当为false的时候,那么等待的那几个event object中的任意一个的状态变为signaled,函数就返回。
         我觉得event object就是一个bool型的变量。
下面是今天晚上从书上摘抄的一段代码:
#include <windows.h>
#include 
<stddef.h>
#include 
<stdlib.h>
#include 
<conio.h>
#include 
<stdio.h>

ULONG WINAPI Thread1(LPVOID para)
{
    printf(
"Enter Thread1!\n");
    HANDLE 
*phEvent = (HANDLE*)para;
    
//设置该事件激发
    SetEvent(*phEvent);
    printf(
"Leave Thread1!\n");
    
return 0;
}


int main()
{
    
//创建同步事件
    HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
    
//开启新线程,并将同步事件句柄指针传递给新线程
    HANDLE hThread1 = (HANDLE)CreateThread(NULL,0,Thread1,&hEvent,0,NULL);
    
//等待该事件触发
    WaitForSingleObject(hEvent,INFINITE);
    printf(
"Leave ThreadMain!\n");
    
return 0;
}
代码的运行结果比较奇怪,如下图所示:

我不懂为什么“Leave Thread1”会打印两次。应该只打印一次就结束的啊???………

posted on 2011-05-21 22:45 纪灿萌 阅读(275) 评论(0)  编辑 收藏 引用 所属分类: 应用编程


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理