C ++ 11线程:条件变量导致意外行为

时间:2015-04-05 11:57:03

标签: linux multithreading c++11

我试图在c ++ 11中使用condition_variable来同步两个线程。 我在ubuntu下使用eclipse,一切都是用g ++编译的。 两个线程都在同一个类中。 第一个线程递增类的私有变量:

void Test::test::Loop()
{
    int loops = 48;
    while (loops > 0)
    {

        std::lock_guard<std::mutex> lock(this->m);
        this->index++;

        // Simulate work
        std::this_thread::sleep_for(std::chrono::milliseconds(10));

        this->Processed = true;
        this->c.notify_one();

        loops--;

    }

    return;
}

作为第一个测试,我想在另一个帖子中显示this-&gt;索引:

void Test::test::Process()
{

    while(this->ProcessData)
    {

        std::unique_lock<std::mutex> lock(this->m);

        while(!this->Processed)
            this->c.wait(lock);

        printf("\n%d", this->index);
        fflush(stdout);

        this->Processed = false;

        this->m.unlock();
        this->c.notify_one();

    }

     return;
}

我也尝试过这个 - &gt; c.wait(lock,[this] {return this-&gt; Processed;})。 结果是程序只显示数字48 [编辑显示的数字是48,而不是1],并且永远不会停止... 我究竟做错了什么? 这是我第一次真正使用condition_variable,但据我所知,c.notify_one()应允许第二个线程显示每次迭代的变量。

很抱歉,如果问题已经被问到,但我没有找到类似的东西。谢谢你的帮助。

0 个答案:

没有答案