while循环中WaitForSingleObject(hEvent,0)与if(bFlag)判断有什么区别?我的理解:
基本一致,都是判断一下标志位,然后进行处理。但是WaitForSingleObject()函数所wait的hEvent对象由操作系统负责多线程的同步,而如果使用if(bFlag),那么bFlag在如果在其他线程被更改,那么if判断时,bFlag的值有可能未得到更新。如果定义bFlag添加volatile关键字又怎样呢?

解决方案 »

  1.   

    Event最主要的作用是阻塞,当event没有被改变的时候是阻塞状态,不占用cpu时间,if语句是即时性的,执行了就过去了,如果配合while(true)使用的话,就会占用大量cpu时间
      

  2.   

    就原理来说,没什么区别,都是检测一下对象的值,只是各自的实现机理不同.事件对象可以跨进程使用
    如果定义bFlag为volatile属性,则每次检测时都是从内存中读取,而不是检查寄存器中的值,这样就不会有未更新的问题
      

  3.   

    WaitForSingleObject(hEvent,0)的一个用法等待外设IO的信号,产生中断效果,如果用Flag就得时不时的监听外设,如果不知道外设什么时候响应就得在 while(1)中监听。
      

  4.   

    WaitForSingleObject 一般用在多线程中你就会自然明白他们的不同了。如果事件为有信号状态,释放所有等待的线程(就是WaitForSingleObject的线程)
      

  5.   


    这个说法准确么?每次的
    if (bFlag){} // 这里的bFlag检查时候是从内存读取的值,那么外部的修改又是如何在机器执行的?如果外部更新不能及时的反应到if(bFlag)那么岂不是出现一次停止不了的问题?使用这种方法时候我也有疑问,但是目前还没有遇到过问题。
      

  6.   

    我也是有相同的疑问,才发个帖子问问。
    目前我也采用的是if这种形式判断停止标志,还没有发现有停止不下来的情况,而且我对实时性要求也不是很高。如果是实时性较高的系统,建议还是不采用这种用法。我没有测试过,倒是可以写测试程序测试测试。要求修改标志和读取标志都必须多线程频繁操作,我想肯定会发现判断标志时的bFlag不是实时值的情况。
      

  7.   

    对于你这种特殊情况其实差别不大
    要注意bFlag笔试volatile的
      

  8.   

    有意思,那当volatile if(bFlag)或else后怎么处理呢?suspend?如果suspend那怎么检测bFlag? 用while?用while那就别说下去了
      

  9.   

    volatile是定义数据每次处理完后直接放回内存,并且每次读取都直接从内存读取.这种声明主要是针对多高速缓存,应为很多时候刚处理完的数据不会放回内存而放回高速缓存,而下次再读取时系统会判断不容缓存之间该数据的值是否一样,如果不一样的话就会更新缓存,这样会浪费时间.单看楼主的例子看不出来楼主的问题,这些标志到底有什么用,如果只是一些简单的判断这两种方法都可以,但是如果涉及到线程同步的话,最好还是用内核对象来判断,不然会有很多问题.简单举个例子.有一个全局变量int gFlag = 0;
    现在有线程A{gFlag++;return 1;}
    然后起2个线程A,那当2个线程都退出后gFlag的值会是多少,我们的目的是2.实际上有可能是1,有可能是2.