2017-03-03 109 views
0

Microsoft Visual C++ 2015中STL的当前实现似乎由于构造函数中的互斥等待而禁止任何无锁环境启动线程。为什么std :: thread在其构造函数中等待?

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)...)); 
    } 

有人能告诉我为什么需要这个等待吗?

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

+0

你想要一个无锁的线程启动?不会发生......它不仅仅是C++ lib的一部分。 – deviantfan

+0

不知何故,堆分配(通过'make_unique')的事实似乎并没有打扰你。堆分配通常不是无锁的。 –

+0

也不要忘记在你的函数执行之前必须由系统获取的加载器锁。 – marcinj

回答

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

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

+0

它可能在堆栈中,以防止'std :: thread'构造函数不应抛出'bad_alloc'异常。 –

相关问题