2017-03-03 111 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'異常。 –

相關問題