0

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 毫秒来构建 astd::thread但从不显示使用CreateThread.

4

1 回答 1

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

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

于 2017-03-03T13:07:52.307 回答