我在 C++ 中遇到了奇怪的情况(至少对我来说 :D )
我的代码是:
static void startThread(Object* r){
while(true)
{
while(!r->commands->empty())
{
doSomthing();
}
}
}
我使用 boost 作为线程启动此函数,其中 r 中的命令是队列...我在另一个线程中填充此队列....
问题是,如果我先填充队列,然后启动此踏板,一切正常...但是如果我先运行 startThread,然后再填充队列命令,它就无法工作...doSomething()不会运行...
但是如果我修改 startThread:
static void startThread(Object* r){
while(true)
{
std::cout << "c" << std::endl;
while(!r->commands->empty())
{
doSomthing();
}
}
}
我刚刚添加了 cout...并且它正在运行...有人可以解释为什么它可以与 cout 一起工作而不是没有吗?或者有人知道哪里出了问题?
也许编译器正在做某种优化?我不这么认为... :( 谢谢
最佳答案
But if I run the startThread first and after that I fill up queue commands, it is not working... doSomething() will not run
当然不是!你期待什么?您的队列为空,因此 !r->commands->empty()
将为 false
。
I just added cout... and it is working
你很幸运。 cout
相对较慢,因此您的主线程有机会在第一次执行内部 while
测试之前填充队列。
那么为什么线程在被主线程填充后看不到 r->commands
的更新版本?因为您的代码中没有任何内容表明您的变量将从外部发生变化,所以编译器假定它不会。
事实上,编译器看到你的 r
的指针不能改变,所以它可以从内部循环中删除冗余检查。使用多线程代码时,您需要明确告诉 C++ 变量可以从不同的上下文更改,使用 atomic memory access .
关于c++ - 而在 C++ 中却不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23385769/