空循环而不循环检查条件

Hoc*_*ock 5 c++ multithreading sleep while-loop conditional-statements

在一个多线程的C++程序中,我在一个线程中运行相当于这个:

while(obj->member) { } // waiting for obj->member to be set to false in another thread
Run Code Online (Sandbox Code Playgroud)

在另一个线程中,obj-> member设置为false.但是,即使将其设置为false,循环也不会中断.如果我改成它:

while(obj->member) { Sleep(1) }
Run Code Online (Sandbox Code Playgroud)

当obj-> member在另一个线程中设置为false时,它按预期工作并中断.
它为什么这样工作?

Mar*_*k H 10

尝试制作会员volatile.这将强制每次使用它时从内存中取出,而不是从CPU寄存器(这是编译器可能优化它的方式)中取出.


Jam*_*ran 6

Obj必须申报volatile.这告诉编译器它的值可能会被其他一些线程改变.

添加时Sleep,编译器知道其他线程正在工作,并假定它可能会更改.