0

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

0 回答 0