我正在创建一个工作进程,该工作进程在管道上等待IDs
,并针对每个ID尝试获取一些数据。提取可能需要一段时间,因此我还创建了一个异步任务来处理超时逻辑。
问题是,如果我通过管道向其发送了多个ID,则它对于前两个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);
}