std :: future :: wait_for导致死锁

时间:2016-03-22 16:13:36

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

我在我的代码std::promisestd::shared_future(这是std::future的多个等待线程版本)中用于异步执行,我发现了一个永远不会回来的情况(死锁)当用100毫秒(或任何其他持续时间)调用此函数时。

这是一段代码(来自我的类​​),假设有人设置与此std::promise相关的std::shared_future的值,阻止该线程:

    bool wait_until_ready(unsigned int msec)
    {
        if (_ready)
            return true;

        std::chrono::milliseconds span(msec);
        std::future_status fstat;
        fstat = _shared_fut.wait_for(span);
        if (fstat == std::future_status::ready)
        {
                _shared_fut.get();
                return true;
        }

        return false;
    }

    void init()
        {
            unique_lock<mutex> lck(_mutex);
            _promise = promise<bool>();
            _shared_fut = _promise.get_future().share();
            _ready = false;
        }

    void set_ready()
    {
        unique_lock<mutex> lck(_mutex);
        if (!_ready)
        {
            _ready = true;
            _promise.set_value(true);
        }
    }

wait_for()的调用始终导致死锁(没有异常被抛出)。

有没有人在std::future之前遇到过这种行为?

0 个答案:

没有答案