Windows核心编程:用内核对象进行线程同步

 

作者:shenzi

链接:http://blog.csdn.net/shenzi

Windows核心编程:用内核对象进行线程同步
1.概述
    用户模式下的同步让线程保持在用户模式下,在用户模式下的进行线程同步的最大好处就是速度非常快。然而它们的确存在一些局限性,使用内核对象进行线程同步用途要广泛得多。然而使用内核对象进行线程同步,必须进行用户模式与内核模式的切换,所以性能上会大打折扣。

    我 们已经讨论了好几种内核对象,包括进程、线程以及作业。几乎所有这些内核对象都可以用来进行同步。对线程同步来说,这些内核对象中的每一种要么处于触发状 态,要么处于未触发状态。Microsooft为每种对象创建了一些规则,规定如何在这两种状态之间进行转换。用内核对象进行线程同步就是要用这些内核对 象的规则为线程同步服务。
2.等待函数
    等待函数 使一个线程自愿进入等待状态,直到指定的内核对象被触发为止。注意,如果线程在调用一个等待函数的时候,相应的内核对象已经处于触发状态,那么线程时不会进入等待状态的。
    DWORD WaitForSingleObject(
        HANDLE hObject, //标识要等待的内核对象,这个内核对象可以处于触发或未触发状态;
        DWORD dwMilliseconds); //指定线程最多愿意花多长的时间来等待对象被触发;

    通常,我们会给dwMilliseconds传入INFINITE,但也可以传任何其它的值(以微妙微单位)。传INFINITE可能会有点危险。如果对象永远不被触发,那么调用线程将永远不会被唤醒——它会一直阻塞在那里,但幸运的是,它并没有浪费宝贵的CPU时间。
    DWORD dw = WaitForSingleObject(hProcess, 5000);
    switch (dw) {
        case WAIT_OBJECT_0:
         // 等待对象被触发,即等待进程已终止;
        break;
        case WAIT_TIMEOUT:
         // 等待超时,即等待的进程在5000微妙内未终止;
        break;
        case WAIT_FAILED:
        // 无效的参数,如无效的进程句柄
        break;
    }

    前述代码告诉系统,除非指定的进程已经终止或者等待时间已满5000微妙,否则不应该对调用线程进行调度。如果进程已经终止,那么这个调用会在5000微妙内返回,如果进程尚未终止,那么这个调用大约会在5000微妙左右返回。注意,如果给dwMilliseconds传0,WaitForSingleObject总会立即返回,即使它要等待的条件还没有满足。
    还有一个函数允许调用线程同时检查多个内核对象的触发状态:
    DWORD WaitForMultipleObjects(
        DWORD dwCount,//表示希望检查的内核对象的数量;最大值MAXIMUM_WAIT_OBJECTS=64
        CONST HANDLE* phObjects,//指向内核对象句柄数组
        BOOL bWaitAll,//TRUE,等待所有内核对象触发;FALSE,等待其中任一对象触发;
        DWORD dwMilliseconds);
//指定线程最多愿意花多长的时间来等待对象被触发;


    HANDLE3];
    h[0] = hProcess1;
    h[1] = hProcess2;
    h[2] = hProcess3;
    DWORD dw = WaitForMultipleObjects(3, h, FALSE, 5000);
    switch (dw) {

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值