首页 > 解决方案 > 如何使一个线程按预期顺序多次等待另一个线程

问题描述

我是 C++ 多线程编程领域的新手。我想从我的磁盘中读取块数据并根据这些数据进行一些计算。为了简化代码,我写了下面的demo来测试一下我的想法。

读取数据函数如下。

void read_value(std::vector<int> &data)
{
    for (int j = 1; j < 5; j++)
    {
        cv_m.lock();
        std::cout << "read data iteration is " << j << std::endl;

        for (int i = 0; i < 5; i++)
            data.at(i) = i * j;
        is_print = true;
        cv_m.unlock();
        cv.notify_one();
    }
}

在这个函数中,我想读取数据 4 次,每次读取后,我想调用另一个函数print_value来输出数据。功能在print_value这里。

void print_value(const std::vector<int> &data)
{
    for (int j = 1; j < 5; j++)
    {
        std::unique_lock<std::mutex> lk(cv_m);
        std::cout << "waiting for output data" << std::endl;
        cv.wait(lk, []{return is_print;});
        for (int i = 0; i < data.size(); i++)
            std::cout << data[i] << std::endl;
        is_print = false;
    }
}

虽然我将print_value函数设置为等待 4 次,但还有一个问题。该read_value函数不会等待该print_value函数,它只会读取 4 次数据。输出结果如下。

read data iteration is 1
read data iteration is 2
read data iteration is 3
read data iteration is 4
waiting for output data
0
4
8
12
16
waiting for output data
Program ended with exit code: 9

我知道两个线程互相等待是非常危险的。似乎条件变量只能在一个线程等待另一个线程而不是我的情况时使用。这个问题有什么解决办法吗?

标签: c++multithreading

解决方案


最后,我通过使用状态转换来解决这个问题。我设置了一个全局变量状态。当状态等于一时,线程一开始读取数据,线程二休眠,直到状态变为二。在这种情况下,虽然 CPU 占用较多资源,但我可以成功地管理我的程序。


推荐阅读