我正在创建一个工作进程,它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);
}