我对C++类有一点问题...
我有一个私有(private)成员bool clientConnected
和一个getter bool isClientConnected() {return clientConnected;}
现在的问题是.. clientConnected是从其他线程设置的。

总的来说,我有一个循环

while (!x.isClientConnected())
{}

现在,如果我在“调试配置”中对其进行编译。
一切正常...当clientConnected设置为true时退出。
但是如果我在Release config中编译它。
编译器将循环优化为常数。
并进行以下操作:
00141C01  cmp         al,bl
00141C03  je          SDL_main+0A1h (141C01h)

al的值永远不会再更新。
所以它总是认为它是错误的。
我也尝试了不稳定的结果

我如何避免在类中进行这种优化,以便在每次调用时更新值,而无需编写类似
bool z = x.isClientConnected();
while (!z) { z = x.isClientConnected(); }

最佳答案

volatile http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx看起来像是您的问题的简单答案:


volatile bool clientConnected;
bool isClientConnected() const volatile {return clientConnected;}

但是-您有循环占用CPU:
while (!x.isClientConnected())
{}

更好的是等待信号量:
x.waitForConnected();
void X::waitForConnected()
{
   WaitForSingleObject(m_connectedSemaphore, ,....);
}

如何在MS Windows中创建/使用信号灯,请参见:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686946(v=vs.85).aspx

10-08 04:11