현재 기본 스레드 풀을 개발 중입니다. 저는 C++ 11의 std::thread
을 std::condition_variable
과 std::unique_lock
과 함께 사용했습니다. 그것은 작동하는 것, 그리고 지금은 너무 많은 것들이 비활성 상태 일 때 일부 스레드를 죽일 수 있기를 원합니다. 지금은 std::queue
이 boost::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()
을 호출해도 안전할까요?
감사합니다. 가장 쉬운 방법은 스레드가 스스로 분리되도록하는 것입니다. – Jukurrpa