※ ChatGPTを利用し、要約された質問です(原文:条件変数を用いた有限バッファ問題を考えています。)
条件変数を用いた有限バッファ問題のプログラムにおける間違いの解説
このQ&Aのポイント
条件変数を用いた有限バッファ問題のプログラムには間違いがあります。
問題の原因は、バッファへのデータの挿入と取り出しの条件が逆になっていることです。
また、生産者スレッドと消費者スレッドの終了条件が異なるために正しい結果が得られません。
皆さんこんにちは。
当方、プログラミングを勉強中の学生です。
条件変数を用いた有限バッファ問題を考えております。
以下に示すソースにおいて、関数produce()は1から1000までの整数を順に生成し、関数consume()はバッファから取り出した値の合計(1から1000までの和、500500となる)を求めるようプログラミングしているつもりなのですが、コンパイルして実行すると思ったような結果となりません。
どこが間違っているかご教授いただければ幸いです。
よろしくお願い致します。
以下、ソースとなります。
#include <stdio.h>
#include <pthread.h>
#define N 5
int buffer[N];
int inptr = 0, outptr = 0;
int count = 0;
int i = 0;
int j = 0;
int sum = 0;
pthread_cond_t full = PTHREAD_COND_INITIALIZER;
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
int produce (void)
{
i += 1;
return i;
}
void consume (int x)
{
j += 1;
sum += x;
}
void *producer(void *arg)
{
int data;
for (;;) {
if (i >= 1000)
break;
data = produce();
pthread_mutex_lock(&lock);
while (count > N) pthread_cond_wait(&full, &lock);
count = count + 1;
buffer[inptr] = data;
inptr = (inptr + 1) % N;
pthread_mutex_unlock(&lock);
pthread_cond_signal(&empty);
}
}
void *consumer(void *arg)
{
int data;
for (;;) {
if (j >= 1000)
break;
pthread_mutex_lock(&lock);
while (count == 0) pthread_cond_wait(&empty, &lock);
count = count - 1;
data = buffer[outptr];
outptr = (outptr + 1) % N;
pthread_mutex_unlock(&lock);
pthread_cond_signal(&full);
consume(data);
}
}
int main()
{
pthread_t a, b;
pthread_create(&a, NULL, producer, NULL);
pthread_create(&b, NULL, consumer, NULL);
pthread_join(a, NULL);
pthread_join(b, NULL);
printf("sum = %d\n", sum);
return 0;
}
お礼
分かりやすい説明感謝致します。 綺麗に解決しました! ご指摘ありがとうございましたm(_ _)m