プロデューサーがバッファー(state.value)に値を生成し、複数のコンシューマーがバッファーを読み取り、配列内で値を更新している状況で作業しようとしています。以下はコードです。1人のプロデューサーと複数のコンシューマー
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex;
pthread_cond_t prod, cons;
static int count = 0;
struct shared_state{
int done;
int value;
int value_available;
int *array;
int j;
}state;
void * producer(void *arg){
int a[] = {12,11,10,9,8,7};
int size = sizeof(a)/sizeof(a[0]);
int i = 0;
while(i<size){
pthread_mutex_lock(&mutex);
while(state.value_available)
pthread_cond_wait(&prod, &mutex);
state.value = a[i++];
printf("In producer: %d\n",state.value);
state.value_available = 1;
pthread_cond_signal(&cons);
pthread_mutex_unlock(&mutex);
}
state.done = 1;
count++;
printf("Producer count: %d\n",count);
pthread_exit(NULL);
}
void * consumer(void *arg){
while(!(state.done)){
pthread_mutex_lock(&mutex);
while(!state.value_available)
pthread_cond_wait(&cons,&mutex);
state.array[(state.j)] = state.value;
printf("In consumer: %d\t%d\n",state.array[state.j], state.j);
(state.j)++;
state.value_available = 0;
pthread_cond_signal(&prod);
pthread_mutex_unlock(&mutex);
}
int i;
for(i=0;i<6;i++)
printf("%d-->",state.array[i]);
printf("\n");
count++;
printf("Consumer count: %d\n",count);
}
int main(void){
state.done = 0;
pthread_t pro,con,con2;
state.value_available = 0;
state.j = 0;
state.array = (int *)malloc(sizeof(int)*6);
pthread_create(&pro, NULL, producer, (void *)NULL);
pthread_create(&con, NULL, consumer, (void *)NULL);
pthread_create(&con2, NULL, consumer, (void *)NULL);
pthread_join(pro,NULL);
pthread_join(con,NULL);
pthread_join(con2,NULL);
pthread_exit(NULL);
printf("\n");
return 0;
}
以下は、私が受け取っている出力です。ただし、2番目のコンシューマスレッドは終了せず、無限ループに入ります。誰かがエラーを特定する際に助けてくれると助かります。ありがとう。
In producer: 12
In consumer: 12
In producer: 11
In consumer: 11
In producer: 10
In consumer: 10
In producer: 9
In consumer: 9
In producer: 8
In consumer: 8
In producer: 7
Producer count: 1
In consumer: 7
Consumer array: 12-->11-->10-->9-->8-->7-->
Consumer count: 2
私の推測では、「第2の」スレッドはpthread_cond_wait(&cons、&mutex)で不定期に待機しています。私はpthread_cond_timedwaitを代わりに使用することをお勧めします – dvhh
あなたは本当にすべての関連するシステムコール(ここでは主に 'pthread _ *()'呼び出しの結果をテストしたいと思います)。これは無料のデバッグです! – alk
関数内:main(): 'pthread_exit(NULL);'の行のために 'printf(" \ n ");'と 'return 0;'は決して実行されません。 – user3629249