while循环中WaitForSingleObject(hEvent,0)与if(bFlag)判断有什么区别?我的理解:
基本一致,都是判断一下标志位,然后进行处理。但是WaitForSingleObject()函数所wait的hEvent对象由操作系统负责多线程的同步,而如果使用if(bFlag),那么bFlag在如果在其他线程被更改,那么if判断时,bFlag的值有可能未得到更新。如果定义bFlag添加volatile关键字又怎样呢?
基本一致,都是判断一下标志位,然后进行处理。但是WaitForSingleObject()函数所wait的hEvent对象由操作系统负责多线程的同步,而如果使用if(bFlag),那么bFlag在如果在其他线程被更改,那么if判断时,bFlag的值有可能未得到更新。如果定义bFlag添加volatile关键字又怎样呢?
如果定义bFlag为volatile属性,则每次检测时都是从内存中读取,而不是检查寄存器中的值,这样就不会有未更新的问题
这个说法准确么?每次的
if (bFlag){} // 这里的bFlag检查时候是从内存读取的值,那么外部的修改又是如何在机器执行的?如果外部更新不能及时的反应到if(bFlag)那么岂不是出现一次停止不了的问题?使用这种方法时候我也有疑问,但是目前还没有遇到过问题。
目前我也采用的是if这种形式判断停止标志,还没有发现有停止不下来的情况,而且我对实时性要求也不是很高。如果是实时性较高的系统,建议还是不采用这种用法。我没有测试过,倒是可以写测试程序测试测试。要求修改标志和读取标志都必须多线程频繁操作,我想肯定会发现判断标志时的bFlag不是实时值的情况。
要注意bFlag笔试volatile的
现在有线程A{gFlag++;return 1;}
然后起2个线程A,那当2个线程都退出后gFlag的值会是多少,我们的目的是2.实际上有可能是1,有可能是2.