我对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