c++ - 如何使一个线程按预期顺序多次等待另一个线程
问题描述
我是 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
我知道两个线程互相等待是非常危险的。似乎条件变量只能在一个线程等待另一个线程而不是我的情况时使用。这个问题有什么解决办法吗?
解决方案
最后,我通过使用状态转换来解决这个问题。我设置了一个全局变量状态。当状态等于一时,线程一开始读取数据,线程二休眠,直到状态变为二。在这种情况下,虽然 CPU 占用较多资源,但我可以成功地管理我的程序。
推荐阅读
- sql - 用于除法和乘法的 SQL Server 计算列公式
- reactjs - WebChat 中的 BotFramework v4 在消息后显示机器人的名称和用户名
- javascript - Vue,Vuetify 没有正确初始化
- python - 带有 attrs 的 PyTorch 模块无法获取参数列表
- python-3.x - 如何在保持索引到位的同时将新列分配给 Pandas 数据框?
- c# - 如何通过 C# Selenium 错误页面?
- powershell - 如何在PowerShell中检查字符串是否不包含很多子字符串
- javascript - 如何在一个 http 请求中使用节点呈现多个 mysql 查询
- tcl - 从 TCL 文件重新创建 Vivado 项目而不复制源代码
- php - html标签未在浏览器中使用 php 显示图像