Eine meiner Aufgaben in der Schule ist es, diesen Code zu reparieren. Der Erzeuger- und der Verbraucher-Thread sollten ihre lokale Variable abwechselnd erhöhen und ausdrucken, aber ich habe keine Ahnung, wie ich sie beheben kann.C: Produzent/Verbraucher
Es sollte möglich sein, dass der Produzent und Consumer-Thread das auf unbestimmte Zeit tun können, aber wenn ich die ausführbare Datei starte, stoppt es willkürlich.
Es wäre toll, wenn mir jemand dieses Verhalten erklären könnte. Hier
ist der Code:
#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;
}
Der Ausgang wie in diesem Beispiel aussehen:
$ ./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...
....
Try [diese] (https://stackoverflow.com/questions/29455170/c-threads-to-print-sequence-of-numbers-with-even-and-odd-number-printing-threa/29455846# 29455846) – user3386109
Hinweis: Warum muss der Consumer-Thread 'sleep (1)' bevor er zuerst den 'cond_consumed' CV signalisiert? –
Tipp 2: Wo ist es möglich, dass jeder Thread blockiert wird? –