c++ - C++ - 如何不错过来自多个线程的多个通知?
问题描述
在我的应用程序中,许多线程通知等待线程。有时这些通知在时间上彼此非常接近,等待线程会错过通知。有什么简单的方法可以解决这个问题吗?下面给出了一个小示例代码。在代码中,task2 通知等待线程,但等待线程 waitingForWork 错过了通知。
#include <condition_variable>
#include <iostream>
#include <thread>
std::mutex mutex_;
std::condition_variable condVar;
bool dataReady{ false };
void waitingForWork() {
for (int i = 0; i < 2; i++)
{
std::cout << "Waiting " << std::endl;
std::unique_lock<std::mutex> lck(mutex_);
condVar.wait(lck, [] { return dataReady; });
dataReady = false;
std::cout << "Running " << std::endl;
}
}
void task1() {
std::this_thread::sleep_for(std::chrono::milliseconds{ 45 });
std::lock_guard<std::mutex> lck(mutex_);
dataReady = true;
std::cout << "Task1 Done:" << std::endl;
condVar.notify_one();
}
void task2() {
std::this_thread::sleep_for(std::chrono::milliseconds{ 46 });
std::lock_guard<std::mutex> lck(mutex_);
dataReady = true;
std::cout << "Task2 Done" << std::endl;
condVar.notify_one();
}
int main() {
std::cout << std::endl;
std::thread t1(waitingForWork);
std::thread t2(task1);
std::thread t3(task2);
t1.join();
t2.join();
t3.join();
std::cout << std::endl;
system("pause");
}
解决方案
这是一个多生产者单消费者问题。此处描述: 多消费者单生产者问题
所以基本上你必须改变你的代码,使每个线程都必须将通知写入线程安全队列。然后你的工作线程必须在这个队列上工作,并且不会再错过任何通知。
推荐阅读
- r - 如何在 geom_col() 中为重复的 x 轴值设置单独的列?
- flutter - 当状态随 Provider 发生变化时,使用 StatelessWidget 是否安全?
- r - 是否有R函数从汉字字符串中提取数量?
- reporting-services - Microsoft 动态媒体集数据类型和 SSRS
- discord.py - 如何使静音命令接受用户 ID 和提及
- python - 从 3d numpy 数组中删除 2d 切片
- validation - 当我在下拉列表谷歌表中选择 Desc 时,你能帮我吗?我希望该值成为唯一编号
- python - 安装 tensorflow 和 tensorflow_probability 时如何解决没有匹配的分布?
- spring - 使用 JWT base64 编码的 Spring Boot 资源服务器由于 JWT 无效而无法进行身份验证
- python - How to make a for loop from left to right, top to bottom in Python?