我注意到,除非在Sleep(1)
循环中使用类似while
的东西,否则它将永远不会中断。
while (*Ns::Gl::G == nullptr) Sleep(1); // Works
while (*Ns::Gl::G == nullptr); // Doesn't work
经过一些研究,我认为这是因为*Ns::Gl::G
被另一个线程或进程更改了,在我的情况下,这似乎很可能。
因此,我试图在以下方面做些事情:
while (*(volatile TYPE **)&*Ns::Gl::G == nullptr);
以及其他许多变体,但无济于事。
Ns::Gl::G
的定义方式包括:
namespace Ns { struct Gl final { static TYPE** G }; TYPE** Gl::G;}
有人知道如何在*Ns::Gl::G
循环内将volatile
变成while
吗? MemoryBarrier()
可行,但我非常希望使用volatile
关键字。
TL; DR-volatile
循环内的while
转换无效。