現在、基本スレッドプールを開発中です。私は、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