학교에서 맡은 일 중 하나는이 코드를 수정하는 것입니다. 생산자와 소비자 스레드는 지역 변수를 교대로 증가시키고 인쇄해야하지만 어떻게 수정해야하는지 잘 모릅니다.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...
....
[this] (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 : 각 스레드를 차단할 수있는 곳은 어디입니까? –