私はC++でマルチスレッドプログラムを作成しており、メインスレッドでは、他のスレッドがパッケージを別のキューに入れるのを待っています。パッケージの種類とそれらがどのスレッドから発生したかによって異なります。
キューは、本来あるべきミューテックスによって保護されています。
しかし、私の主な目的は、やりたくないことです。
while(true)
if(!queue1->empty)
{
do stuff
}
if(!queue2->empty)
{
do stuff
}
etc
したがって、条件変数を使用して、何かが変更されたことをメインに通知する必要があります。現在、1つの条件変数でしかブロックできないため、これらすべてのスレッドで同じ条件変数と付随するミューテックスを使用する必要があります。今、私はこのミューテックスを実際に使用してすべてのスレッドをロックしたくありません。1つのスレッドがキューに書き込んでいるときに、別のスレッドがまったく異なるキューに書き込むことができないという意味ではありません。そのため、キューごとに個別のミューテックスを使用します。しかし、条件変数に付属するこの追加のミューテックスをどのように使用すればよいでしょうか。
stdと非常によく似た、ブーストを使用した2つのスレッドと1つのキューでどのように行われるか。 http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html:
template<typename Data>
class concurrent_queue
{
private:
boost::condition_variable the_condition_variable;
public:
void wait_for_data()
{
boost::mutex::scoped_lock lock(the_mutex);
while(the_queue.empty())
{
the_condition_variable.wait(lock);
}
}
void push(Data const& data)
{
boost::mutex::scoped_lock lock(the_mutex);
bool const was_empty=the_queue.empty();
the_queue.push(data);
if(was_empty)
{
the_condition_variable.notify_one();
}
}
// rest as before
};
では、これをどのように解決しますか?