2012-02-02 49 views
8

現在、基本スレッドプールを開発中です。私は、C++ 11のstd::threadと、std::condition_variableと、std::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()を呼び出すことはできません。自分自身に参加するスレッドのための試みがデッドロックにつながる、とC++ 11個の実装がそれを認識し、resource_deadlock_would_occurのエラー状態でsystem_errorをスローする必要があります。

また、std::threadの特定のインスタンスに関連付けられたスレッドが実行を完了しようとしているメインスレッドに(std :: atomic変数などを介して)メッセージを残して、メインスレッドにこれを参加させることができます後の時点でインスタンス化されます。

+0

ありがとうございます。おそらく最も簡単な方法は、スレッドを自分自身から切り離すことです。 – Jukurrpa

関連する問題