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
顯示此延遲。
你想要一個無鎖的線程啓動?不會發生......它不僅僅是C++ lib的一部分。 – deviantfan
不知何故,堆分配(通過'make_unique')的事實似乎並沒有打擾你。堆分配通常不是無鎖的。 –
也不要忘記在你的函數執行之前必須由系統獲取的加載器鎖。 – marcinj