私は現在、std::thread
を使用して非常に単純なスレッドプールを作成しようとしています。 与えられたタスクが完了した後にスレッドを「生きている」状態に維持するために、私はstd::mutex
をそれぞれに関連付けます。 true
へm_bAvailable
設定したスレッドオブジェクトのために、ThreadPool
検索をi
を見つけるにはミューテックスロックは、要求されたのと同じ順序で行われますか?
// Thread loop
while (1)
{
m_oMutex->lock();
m_oMutex->unlock();
m_bAvailable = false;
m_oTask();
m_bAvailable = true;
}
// ThreadPool function which gives a task to a thread
void runTask(boost::function<void()> oTask)
{
[...]
m_oThreads[i]->setTask(oTask);
m_oMutexes[i]->unlock(); // same mutex as thread's m_oMutex
m_oMutexes[i]->lock();
}
:
原理は多少このようなものです。対応するミューテックスのロックを解除し、thread
がそれをロックしてタスクを実行できるようにします。 thread
は即座にロックを解除し、ThreadPool
は再びロックできるので、thread
はタスクが完了すると停止します。
しかし、問題は、スレッドがスレッドに要求する順序でロックされることですか?つまり、thread
がmutex
にロックを行った場合、ThreadPool
はロックを解除して再びロックします。最初にthread
にロックが渡されますか?そうでない場合は、それを保証する方法はありますか?
ありがとうございました。 'condition_variable'はそのトリックを完璧にするようです。しかし、私はhttp://en.cppreference.com/w/cpp/thread/condition_variable/waitでその例を試してみました。なぜ、最初のスレッドが 'std :: unique_lock'を' cv_m 'が(unique_lock'のコンストラクタで)mutexをロックする最初のものであるため、パラメータとしてブロックされます。 – Jukurrpa
この例では、待機スレッドはおそらくすべてロックを取得し、信号を待つ間にロックを解放します。これらのスレッドが非同期的に実行されているため、非決定論的にロックを取得する順序。マルチスレッドの性質のために、それらが "待機"コールから目覚めた順序も未定義です。 1つのことは確かですが、それはそれらのスレッドのそれぞれが "cerr <<"を実行している間、mutex経由でコードに排他ロックを持つことです。 –