由于构造函数中的互斥等待,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
时显示此延迟。
答案 0 :(得分:3)
_LaunchPad<_Target> _Launcher(_STD forward<_Target>(_Tg));
_Launcher
在堆栈上并传递给新线程。为什么?我不知道,但这使得_Launcher
在新线程完成之前不会超出范围变得很重要。等待可能会保证这一点。