2012-02-02 6 views
8

현재 기본 스레드 풀을 개발 중입니다. 저는 C++ 11의 std::threadstd::condition_variablestd::unique_lock과 함께 사용했습니다. 그것은 작동하는 것, 그리고 지금은 너무 많은 것들이 비활성 상태 일 때 일부 스레드를 죽일 수 있기를 원합니다. 지금은 std::queueboost::function 초입니다. 나는 스레드가 루프를 빠져 나가야한다는 것을 알기 위해 빈 뭉치를 추가하려고 생각하고 있었다. boost::function. 스레드의 루프는 다음과 같이이다 :,std :: thread를 분리하고 종료하기

void ThreadPool::threadLoop() 
{ 
    boost::function<void()>  oThreadTask; 
    std::unique_lock<std::mutex> oLock(m_oTaskMutex); 

    while (1) 
    { 
     // m_oCV is a static std::condition_variable 
     // m_oTaskQueue is a static std::queue< boost::function<void()> > 
     m_oCV.wait(oLock, [](){ return m_oTaskQueue.size(); }); 
     oThreadTask = m_oTaskQueue.front(); 
     m_oTaskQueue.pop(); 
     m_oTaskMutex.unlock(); 
     if (oThreadTask.empty()) 
     break ; 
     oThreadTask(); 
    } 
    // ?? 
} 

건은 내가 루프를 종료하면 제대로 실을 분리하는 방법을 모르겠어요. 스레드 핸들 (나는 std::list<std::thread*>에 액세스 할 수 있으며 해당 ID를 std::this_thread::get_id()과 비교할 수 있음)을 찾아보고 스레드 자체에서 detach() 또는 심지어 join()을 호출해도 안전할까요?

답변

11

예, 모든 스레드 객체가 저장되어있는 경우, 당신은 thread::idthis_thread::get_id()로 동일한 하나를 찾을 수 있습니다, 당신은 그것을 detach()를 호출하고 C++ 11 표준은하지 않습니다 (그 후 스레드 객체를 파괴 할 수있다 그것을 막고, 나는 이것이 일반적인 관행에 근거한다고 믿는다). 다른 실행 스레드가 파괴 된 std::thread의 인스턴스에 액세스하지 않는지 확인하십시오.

하지만 당신은 스레드 자체 join() 호출 할 수 없습니다 : 교착 상태가 발생할 것 자체에 참여하는 스레드에 대한 시도, 그 인식과 resource_deadlock_would_occur의 오류 조건 system_error가 발생한다 C++ (11 개) 구현.

또는 std::thread의 특정 인스턴스와 연결된 스레드가 주 스레드에 실행을 완료하려고한다는 메시지 (예 : std :: atomic 변수를 통해)를 남겨두고 기본 스레드가이 스레드와 조인하도록 할 수 있습니다 나중에 인스턴스.

+0

감사합니다. 가장 쉬운 방법은 스레드가 스스로 분리되도록하는 것입니다. – Jukurrpa

관련 문제