学校での私の仕事の1つは、このコードを修正することです。プロデューサとコンシューマスレッドは、ローカル変数を交互にインクリメントして出力する必要がありますが、どのように修正するかわかりません。C:プロデューサー/コンシューマー
プロデューサとコンシューマのスレッドが無期限に実行できる可能性がありますが、実行可能ファイルを開始すると、任意に停止します。
誰かがこの行動を私に説明できるのは素晴らしいことです。ここで
コードは次のとおりです。
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
static pthread_mutex_t mutex;
static pthread_cond_t cond_consumed = PTHREAD_COND_INITIALIZER;
static pthread_cond_t cond_produced = PTHREAD_COND_INITIALIZER;
static void *producer(void *arg)
{
unsigned long count=0;
while(1) {
printf("producer: wait...\n");
pthread_mutex_lock(&mutex); // enter critical section
pthread_cond_wait(&cond_consumed, &mutex);
printf("producer: PRODUCE %ld...\n", count++);
pthread_cond_signal(&cond_produced);
pthread_mutex_unlock(&mutex); // leave critical section
}
return NULL;
}
static void *consumer(void *arg)
{
unsigned long count=0;
sleep(1);
pthread_cond_signal(&cond_consumed);
while(1) {
printf("consumer: wait...\n");
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond_produced, &mutex);
printf("consumer: CONSUME %ld...\n", count++);
pthread_cond_signal(&cond_consumed);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main(int argc, char **argv, char **envp)
{
pthread_t p1, p2;
if (pthread_mutex_init(&mutex, NULL)) {
perror("pthread_mutex_init");
return -1;
}
pthread_create(&p2, NULL, consumer, NULL);
pthread_create(&p1, NULL, producer, NULL);
pthread_join(p1, NULL);
pthread_join(p2, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
出力は、この例のようになります。発生する可能性があります
$ ./event
producer: wait...
consumer: wait...
producer: PRODUCE 0...
producer: wait...
consumer: CONSUME 0...
consumer: wait...
producer: PRODUCE 1...
producer: wait...
consumer: CONSUME 1...
consumer: wait...
producer: PRODUCE 2...
producer: wait...
consumer: CONSUME 2...
consumer: wait...
....
[こちら](https://stackoverflow.com/questions/29455170/c-threads-to-print-sequence-of-numbers-with-even-and-odd-number-printing-threa/29455846#) 29455846) – user3386109
ヒント:コンシューマスレッドは、最初に 'cond_consumed' CVを通知する前に' sleep(1) 'する必要がありますか? –
ヒント2:各スレッドをブロックすることは可能ですか? –