Почему std :: thread ожидает своего конструктора?

Текущая реализация STL в Microsoft Visual C ++ 2015, по-видимому, запрещает любой среде без блокировки запускать поток из-за ожидания мьютекса в конструкторе.

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

Решение

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

_Launcher находится в стеке и передается новому потоку. Зачем? Я не знаю, но это делает важным, чтобы _Launcher не выходить за рамки, пока новая нить не закончится с ним. Ожидание, вероятно, там, чтобы гарантировать это.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]