有点诡异的有关问题

有点诡异的问题
代码不好上了
是这样的。

全局变量  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关键字,看看这个关键字的用处就明白了