私はスレッドを使用して計算を行う必要がある大学の割り当てがあります。それは、複数の生産者を持つ1つの消費者にまで沸き立ちます。>各生産者は1つの計算を行い、消費者はそれをすべて一緒に追加します。C - Pthreads、1つのコンシューマ、複数のプロデューサ同期
プロデューサーがクリエイティブを計算してクリティカルセクションを終了するたびにプロデューサーがクリティカルセクションに入るように、これを同期させるのに問題があります。
ここで私が持っているコードは、これまでだ:
CONSUMER
do
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&consumer, &mutex);
/*Do some stuff*/
pthread_mutex_unlock(&mutex);
count++;
} while(count < m); /*Where m is the number of producers*/
PRODUCER - 各プロデューサーが一つの値だけ(必須 - 割り当て)を生成
pthread_mutex_lock(&mutex);
/*Do some stuff*/
pthread_cond_signal(&consumer);
pthread_mutex_unlock(&mutex);
がそれです条件とmutexだけでこれを行うことは可能ですか?そうでない場合は、セマフォを追加すると簡単になりますが、むしろ試してみることにします。
各プロデューサは、消費者がアクセスする必要があるグローバル変数に製品を配置する必要があります。
他に必要なものがある場合は、お知らせください。
SOLUTION :ジョン・ボリンジャーの回答を読んだ後、私は私の問題を解決し、作業プロデューサ/コンシューマの問題を作成することができました。
/******************CONSUMER*****************/
pthread_mutex_lock(&mutex);
while(count < m) /*While there are more threads*/
{
/*Makes producers wait for the consumer to be ready before
altering the global variable*/
if(predicate = -1)
{
predicate = 0;
pthread_cond_signal(&producer);
}
/*Make consumer wait for the global variable to be altered*/
while(predicate == 0)
pthread_cond_wait(&consumer, &mutex);
/*Do some stuff with global variable*/
predicate = 0; /*Consumed*/
count++;
/*Tell a producer that the predicate has been consumed*/
pthread_cond_signal(&producer);
}
pthread_mutex_unlock(&mutex);
/********************PRODUCER********************/
pthread_mutex_lock(&mutex);
/*If the consumer is not ready yet, wait. I.e. if it's still
creating more threads*/
if(predicate == -1)
{
pthread_cond_wait(&producer, &mutex);
}
/*If there is already a product to be consumed, wait until
*consumed*/
while(predicate != 0)
{
pthread_cond_wait(&producer, &mutex);
}
/*Do some stuff with global variable*/
/*Tell consumer that a product is ready to be consumed*/
pthread_cond_signal(&consumer);
pthread_mutex_unlock(&mutex);
すべての子(コンシューマ)スレッドが並行して実行され、親(プロデューサ)スレッドが結果を収集するだけであれば、それらを1つずつ「pthread_join」できます。とにかくこれを行うべきでしょう。 – Useless
@Useless今私は正しい方向に向いてくれてありがとうございました。 – MichaelDawn
@Useless、私は 'EDIT1'の下に少しの情報を追加しました。なぜなら、プロデューサが結果にアクセスする方法があるから、pthread_joinを使うことはできないと思いますか? – MichaelDawn