C ++-使用异步运行函数会导致随机阻塞

时间:2018-08-14 18:20:16

标签: c++ multithreading c++11 asynchronous stdasync

我正在创建一个工作进程,该工作进程在管道上等待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);
}

0 个答案:

没有答案