私は仕事に私のプロジェクトを取得して問題を抱えています中とは、誰かが助けることができ期待していました。次のようなガイドラインは以下のとおりです。マルチスレッドプロデューサーおよびコンシューマー・セマフォと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
それは子供かのように思えますスレッドが実行されていないか、セマフォが正しく動作していないため、デッドロックが発生しています。私のコードをより良くするか、適切に動作させるかについての推奨は、大いに感謝しています。