我对C ++类有点问题...
我有一个私人会员bool clientConnected
和一个吸气剂bool isClientConnected() {return clientConnected;}
现在问题是.. clientConnected是从不同的线程设置的。
在主要我有一个循环
while (!x.isClientConnected())
{}
现在如果我在Debug config中编译它
一切正常......当clientConnected设置为true时立即退出
但如果我在Release配置中编译它。
编译器将循环优化为常量
并提出以下建议:
00141C01 cmp al,bl
00141C03 je SDL_main+0A1h (141C01h)
al的值永远不会再次更新 所以它总是认为它是假的 我也尝试了挥发性的,相同的结果
如何在课堂上阻止此优化,以便在每次调用时更新值,而无需编写类似
的内容bool z = x.isClientConnected();
while (!z) { z = x.isClientConnected(); }
答案 0 :(得分:4)
对于踩踏问题,您需要使用线程同步,以保证从一个线程到另一个线程的更改传播。
C ++ 11对线程有一些直接的支持,但我没有使用它。
如果您没有支持该编译器的编译器,请尝试使用Boost线程。
答案 1 :(得分:3)
volatile
http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx看起来像是对问题的简单回答:
“声明为volatile的对象不会在某些优化中使用,因为它们的值可能随时发生变化。”
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
答案 2 :(得分:0)
您可以通过在源文件中移动方法的实现来欺骗编译器,并强制它不被内联(查找编译器的特定语法)。