多线程活动等待循环永远

时间:2017-12-11 19:55:07

标签: c++ multithreading gcc

我遇到了一些奇怪的东西,这可能是g ++中的一个错误,因为我没有使用vx ++重现错误,感谢rextester.com

这是我的简单代码:

#include <iostream>
#include <thread>
#include <unistd.h>

bool cond;

void fct1()
{

    std::cout << "fct1 hello" << std::endl;

    while(!cond)
    {
        //std::cout << "fct1 wait cond" << std::endl;
    }

    std::cout << "fct1 ok" << std::endl;
}

int main()
{
    cond = false;
    std::thread t(fct1);

    std::cout << "Hello, world!\n";

    usleep(100); // some work
    cond = true;
    std::cout << "waiting" << std::endl;
    t.join();

    std::cout << "end" << std::endl;
}

“usleep”是指让线程在“cond”设置为true之前到达“while”语句的时间。因此,有时,根据CPU的负载,这可以工作,但通常不会。 我得到的是:

Hello, world!
fct1 hello
waiting

来自rextester.com服务器的SIGKILL因为它永远运行。

但是,有趣的是,这是行

std::cout << "fct1 wait cond" << std::endl;

然后你得到类似的东西:

Hello, world!
fct1 hello
fct1 wait cond
fct1 wait cond
fct1 wait cond
...
fct1 wait cond
fct1 wait cond
fct1 wait cond
fct1 wait cond
fct1 wait cond
waiting
fct1 ok
end

所以我的问题是: 当while语句什么都不做的时候为什么它不起作用? 条件变量是不可避免的吗?

正如我所说,我也试过

#include <windows.h>
...
Sleep(100);

并且有效。

对于带有

的gcc,它既不起作用
while(!cond);
while(!cond) continue;

谢谢

1 个答案:

答案 0 :(得分:0)

正如Swift所说,只需在cond变量中添加volatile属性就可以使用g ++。所以看起来gcc似乎通过注意线程与主线程的非同步来进行不想要的优化。

因此使用std :: atomic变量应该可以解决这类问题。 http://www.cplusplus.com/reference/atomic/atomic/atomic/

感谢提示和正确的评论。