2016-10-19 10 views
0

私は仕事に私のプロジェクトを取得して問題を抱えています中とは、誰かが助けることができ期待していました。次のようなガイドラインは以下のとおりです。マルチスレッドプロデューサーおよびコンシューマー・セマフォとC

あなたは4つのプロデューサースレッドと4つの消費者のスレッドを作成するために pthreadのパッケージを使用します。各生産者スレッドはサイズ10,000,000文字のバッファに 文字「X」を挿入します。各消費者スレッドはバッファから最も最近に挿入さ 文字を削除します。各スレッドは、プロセスを繰り返し

は、これまでのところ私のコードは次のようになります。

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 
#include <semaphore.h> 
#include <pthread.h> 

#define N 10000000 

sem_t mutex; 
sem_t full; 
sem_t empty; 

typedef struct 
{ 
    char const* buf[N]; 
    char in; 
    char out; 

} bufferItems; 

bufferItems sharedBuffer; 


void *producer(void *arg) { 

    while(1) { 
     sem_wait(&empty); 
     sem_wait(&mutex); 
     sharedBuffer.buf[sharedBuffer.in] = "X"; 
     sharedBuffer.in = (sharedBuffer.in+1)%N; 
     printf("Producer\n"); 
     sem_post(&mutex); 
     sem_post(&full); 


    } 

} 

void *consumer(void *arg){ 

    while(1){ 
     sem_wait(&full); 
     sem_wait(&mutex); 
     sharedBuffer.buf[sharedBuffer.out] = NULL; 
     sharedBuffer.out = (sharedBuffer.out+1)%N; 
     printf("Consumer\n"); 
     sem_post(&mutex); 
     sem_post(&empty); 

    } 

} 


int main(void) { 

    sem_init(&mutex, 0, 0); 
    sem_init(&full, 0, 0); 
    sem_init(&empty, 0, N); 

    pthread_t p; 
    pthread_t c; 


    // create four producer threads 
    for(int t=0; t<4; t++){ 
     printf("In main: creating producer thread %d\n", t); 
     int err = pthread_create(&p,NULL,producer,NULL); 
     if (err){ 
      printf("ERROR from pthread_create() on producer thread %d\n", err); 
      exit(-1); 
     } 
    } 


    // create four consumer threads 
    for(int t=0; t<4; t++){ 
     printf("In main: creating consumer thread %d\n", t); 
     int err = pthread_create(&c,NULL,consumer,NULL); 
     if (err){ 
      printf("ERROR; from pthread_create() on consumer thread %d\n", err); 
      exit(-1); 
     } 
    } 
} 

しかし、私はそれを実行したときに私が手出力はこれです:

In main: creating producer thread 0 
In main: creating producer thread 1 
In main: creating producer thread 2 
In main: creating producer thread 3 
In main: creating consumer thread 0 
In main: creating consumer thread 1 
In main: creating consumer thread 2 
In main: creating consumer thread 3 

それは子供かのように思えますスレッドが実行されていないか、セマフォが正しく動作していないため、デッドロックが発生しています。私のコードをより良くするか、適切に動作させるかについての推奨は、大いに感謝しています。

答えて

1

あなたはすべての子スレッドを作成した後、あなたのメインスレッドでpthread_joinを呼び出す必要があります。 pthread_joinは終了する指定されたスレッドを待ちます。それ以外の場合は、メインスレッドは終了して、すべての子スレッドを早期に取り出します。

関連する問題