c++ - C++ - 使用异步运行函数会导致随机阻塞
问题描述
我正在创建一个工作进程,它IDs
在管道上等待并针对每个 ID 尝试获取一些数据。此获取可能需要一段时间,因此我还创建了一个异步任务来处理超时逻辑。
问题是,如果我通过管道向它发送多个 ID,它将对前 2 个 ID 正常工作,但随后随机阻塞,直到超时到期,之后它将获取下一个 ID。
我的代码附在下面,我正在做的是为每个 ID 创建 2 个异步任务(我猜它们在自己的线程上运行)一个任务用于查询(get_data
),另一个用于超时。我不是专家,但我的理解是,将为每个消息的异步任务创建线程,而主线程继续从管道读取消息。
如果有人能指导我弄清楚它为什么会阻塞,将不胜感激。
while (true)
{
char message[100];
read(comm_pipe[0], message, 100);
long id = std::stol(message);
bool done = false;
std::mutex m;
auto work = [&] {
auto data = get_data(id);
std::lock_guard<std::mutex> work_lock(m);
if (!done)
{
done = true;
save(id, data);
}
};
auto async_timeout = [&] {
std::this_thread::sleep_for(std::chrono::milliseconds(10000));
std::lock_guard<std::mutex> timeout_lock(m);
if (!done)
{
done = true;
save(id, "time out");
}
};
std::future<void> task = std::async(std::launch::async, work);
std::future<void> timeout_task = std::async(std::launch::async, async_timeout);
}
解决方案
推荐阅读
- c++ - 正常声明数组时,内存是静态分配、动态分配还是其他方式分配?
- python - Python 类 理解方法
- aliexpress - 在速卖通 API 中哪里可以找到 app_signature?
- python - Tkinter:单击按钮后如何获取值?
- javascript - 如何在 multer 的字段数组中使文件上传可选
- flutter - Flutter Web键盘滚动不适用于非默认滚动控制器
- c# - SSRS 服务器给出 401 Unauthorized 响应,但仅在通过 API 调用时
- c# - AvaloniaUI - ExtendClientAreaToDecorationsHint 和面板
- javascript - 如何在 MongoDB 聚合中格式化组函数的日期
- c# - 如何从计时器调用函数