有点诡异的有关问题
有点诡异的问题
代码不好上了
是这样的。
全局变量 bool is=false;
线程a
我在线程a中不停的探测全局变量是否置为true
while(!is);
是一个空循环;
线程b
在线程b中,一段时间后我把is置为true;
问题来了,道理说。置true 之后 while语句应该是退出了。可是却出现了诡异的现象。
在debug中正常,但是一到 release中就有问题了。死循环,没法调试。
如果我在while语句中加个延时 啥的,就正常了。迷茫了咋回事。只有这两个线程操作is。
ps:
或者是不是 和我的运行时 的上下文 环境有关系。
我用的 是qt 在windows 7开发。
上面的是我抽象了的问题;
事实上是这样。在独立的非ui线程,先向 ui 线程发了个异步信号,在ui线程启动阻塞的dialog。然后独立线程中的 while语句不停的探测is。dailog处理完后。置true。然后 独立线程继续向下走。
会不会是qt机制哪里造成的,怎么办?????
------解决方案--------------------
Release版进行了优化,在你的线程的循环代码中,发现is没有被改变过(编译器这样认为,因为循环中没有改变它的代码),所以就不会再去存储器中读取它的值。而你调用Sleep后,编译器不确定寄存器中暂存的值没有被Sleep函数改变,于是就重新去读了一次,避开了错误。
volatile声明可以阻止编译器进行这种优化,适用于多线程共享的数据,或是与外设交换信息的数据。
------解决方案--------------------
可能被多个线程访问的数据一定记得用volatile关键字,看看这个关键字的用处就明白了
代码不好上了
是这样的。
全局变量 bool is=false;
线程a
我在线程a中不停的探测全局变量是否置为true
while(!is);
是一个空循环;
线程b
在线程b中,一段时间后我把is置为true;
问题来了,道理说。置true 之后 while语句应该是退出了。可是却出现了诡异的现象。
在debug中正常,但是一到 release中就有问题了。死循环,没法调试。
如果我在while语句中加个延时 啥的,就正常了。迷茫了咋回事。只有这两个线程操作is。
ps:
或者是不是 和我的运行时 的上下文 环境有关系。
我用的 是qt 在windows 7开发。
上面的是我抽象了的问题;
事实上是这样。在独立的非ui线程,先向 ui 线程发了个异步信号,在ui线程启动阻塞的dialog。然后独立线程中的 while语句不停的探测is。dailog处理完后。置true。然后 独立线程继续向下走。
会不会是qt机制哪里造成的,怎么办?????
多线程
全局变量
------解决方案--------------------
Release版进行了优化,在你的线程的循环代码中,发现is没有被改变过(编译器这样认为,因为循环中没有改变它的代码),所以就不会再去存储器中读取它的值。而你调用Sleep后,编译器不确定寄存器中暂存的值没有被Sleep函数改变,于是就重新去读了一次,避开了错误。
volatile声明可以阻止编译器进行这种优化,适用于多线程共享的数据,或是与外设交换信息的数据。
------解决方案--------------------
可能被多个线程访问的数据一定记得用volatile关键字,看看这个关键字的用处就明白了