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

아무도 왜이 대기 시간이 필요한지 말할 수 있습니까?

저는 현재 std::thread을 구성하는 데 500 밀리 초가 필요한 시스템을 검사하지만 CreateThread을 사용하여이 지연을 표시하지 않기 때문에 묻습니다.

+0

잠금 해제 스레드를 시작 하시겠습니까? 일어나지 않을 것입니다 ... 그것은 C++ lib 부분이 아닙니다. – deviantfan

+0

어쨌든, 힙 할당 (make_unique의 방식으로)이 관련되어 있다는 사실은 당신을 괴롭히지 않는 것처럼 보입니다. 힙 할당은 일반적으로 lock-free가 아닙니다. –

+0

또한 함수가 실행되기 전에 시스템에서 가져와야하는 로더 잠금을 잊어 버립니다. – marcinj

답변

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

_Launcher은 스택에 있으며 새 스레드로 전달됩니다. 왜? 모르겠지만 새 스레드가 끝날 때까지 _Launcher이 범위를 벗어나지 않는 것이 중요합니다. 대기 상태가이를 보장 할 가능성이 있습니다.

+0

'std :: thread' 생성자가 던지지 않아야하는'bad_alloc' 예외를 막기 위해 스택에있을 것입니다. –

관련 문제