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)...));
}
아무도 왜이 대기 시간이 필요한지 말할 수 있습니까?
저는 현재 std::thread
을 구성하는 데 500 밀리 초가 필요한 시스템을 검사하지만 CreateThread
을 사용하여이 지연을 표시하지 않기 때문에 묻습니다.
잠금 해제 스레드를 시작 하시겠습니까? 일어나지 않을 것입니다 ... 그것은 C++ lib 부분이 아닙니다. – deviantfan
어쨌든, 힙 할당 (make_unique의 방식으로)이 관련되어 있다는 사실은 당신을 괴롭히지 않는 것처럼 보입니다. 힙 할당은 일반적으로 lock-free가 아닙니다. –
또한 함수가 실행되기 전에 시스템에서 가져와야하는 로더 잠금을 잊어 버립니다. – marcinj