为什么std :: thread在其构造函数中等待?

时间:2017-03-03 13:03:21

标签: c++ visual-c++ lock-free visual-c++-2015

由于构造函数中的互斥等待,Microsoft Visual C ++ 2015中STL的当前实现似乎不允许任何无锁环境启动线程。

void _Launch(_Thrd_t *_Thr)
    {   // launch a thread
    _Thrd_startX(_Thr, _Call_func, this);
    while (!_Started)
        _Cnd_waitX(_Cond, _Mtx); // <-- Why?
    }

template<class _Target> inline
    void _Launch(_Thrd_t *_Thr, _Target&& _Tg)
    {   // launch a new thread
    _LaunchPad<_Target> _Launcher(_STD forward<_Target>(_Tg));
    _Launcher._Launch(_Thr);
    }

explicit thread(_Fn&& _Fx, _Args&&... _Ax)
    {   // construct with _Fx(_Ax...)
    _Launch(&_Thr,
        _STD make_unique<tuple<decay_t<_Fn>, decay_t<_Args>...> >(
            _STD forward<_Fn>(_Fx), _STD forward<_Args>(_Ax)...));
    }

有人可以告诉我为什么需要等待吗?

我问,因为我目前正在检查一个系统,有时需要超过500毫秒来构建std::thread,但从未在使用CreateThread时显示此延迟。

1 个答案:

答案 0 :(得分:3)

_LaunchPad<_Target> _Launcher(_STD forward<_Target>(_Tg));

_Launcher在堆栈上并传递给新线程。为什么?我不知道,但这使得_Launcher在新线程完成之前不会超出范围变得很重要。等待可能会保证这一点。