c++ - 而在 C++ 中却不能正常工作

标签 c++ multithreading while-loop

我在 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/

相关文章:

c++ - 在 C++ 中 << 和 >> 之间的运行时切换

c++ - 了解 C++ 中的 clock() 和 CLOCKS_PER_SEC

c++ - 亚信 : usage of self shared pointer in the examples

c++ - C++中基于超时的并发队列

ruby - 我如何遍历一组数字,做一些加法并追加到数组?

C++ odbc 关闭记录集泄漏内存

Ruby 1.9.3-p140 - 使用线程 - 如何等待所有结果从线程中出来?

c# - WinForms 应用程序分析

java - 创建一个重复循环,以便程序会询问用户是否需要另一个条目,直到用户指示 “No.”

python - 如何循环整个 python 脚本以及每次运行更改顺序