Obecnie tworzę podstawową pulę wątków. Użyłem C++ 11: std::thread
, wraz z std::condition_variable
i std::unique_lock
. Wydaje się, że działa i chciałbym teraz móc zabijać wątki, gdy zbyt wiele z nich jest nieaktywnych. Na razie ich prace są wykonywane przez std::queue
z boost::function
. Myślałem o dodaniu paczki pustych boost::function
s, więc wątki wiedzą, że muszą wyjść z pętli. pętli wątku jest tak:Pobierz std :: thread, aby się odłączyć i zakończyć samoczynnie
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();
}
// ??
}
Chodzi o to, że nie jestem pewien, jak prawidłowo odłączyć wątek kiedyś wyszedł z pętli. Czy można odszukać uchwyt nici (mam dostęp do std::list<std::thread*>
i mogę porównać ich identyfikatory z std::this_thread::get_id()
) i czy można bezpiecznie wywołać detach()
z samego wątku, czy nawet join()
?
Dziękuję. Najprostszym sposobem będzie prawdopodobnie oderwanie się nici. – Jukurrpa