だから私は生産者と消費者のコードであるこのコードに取り組んでいます。プログラムを完全に実行します。実際にはスリープから復帰することはないため、クリティカル セクションで実際に何も実行することはありません。コードが実行されている場所を把握するために、いたるところに print ステートメントを追加しました。これは、プロデューサー関数とコンシューマー関数の両方に入りますが、sleep() 関数の後の部分には決して入りません。
これが私のメインです:
/* 1. Get command line arguments argv[1], argv[2], argv[3] */
/* n1=arg[2], n2=arg[3]
/* 2. Initialize buffer, mutex, semaphores, and other global vars */
/*create the mutex lock */
/* create the semaphore and initialize it to 3 */
/*creating full semaphore and initializing it to 0 */
/*** critical section ***/
/* get the default attribute */
pthread_attr_init(&attr);
/* 3. Create producer thread(s) */
while (count < n1)
{
pthread_t tid;
/* create a new thread */
pthread_create(&tid, &attr, producer, NULL);
count++;
}
printf("OUTSIDE OF PRODUCER CREATION\n");
/* 4. Create consumer thread(s) */
count = 0;
while(count < n2)
{
pthread_t tid2;
/* create a new thread */
pthread_create(&tid2, &attr, consumer, NULL);
count++;
}
printf("after the crit section \n");
/* 5. Sleep */
/* 6. Realease resources, e.g destroy mutex and semaphores */
私は大部分、私が問題を抱えていることがわかっているコードだけを含めました。残りはコメントです。これが私のプロデューサーのコードです。消費者は基本的に同じです:
void *producer(void *param) {
buffer_item rand;
unsigned int *seed;
seed = (unsigned int *)malloc(sizeof(unsigned int));
*seed = 10;
while (1) {
printf("Inside producer function\n");
/* Sleep for a random period of time */
r = (rand_r(seed))/divide;
sleep(r);
printf("producer slept\n");
//wait(empty)
//wait(mutex)
printf("producer locked mutex\n");
//crit section - add item to buffer
/*Generate a random number */
/*insert random number*/
printf("producer inserted item \n");
if (resp < 0)
printf("Producer error condition\n"); //Report error condition
//signal mutex
//signal empty
}
}
a.out 4 4 4 を実行すると、出力として次のようになります。
Inside producer function
Inside producer function
Inside producer function
OUTSIDE OF PRODUCER CREATION
Inside producer function
inside consumer function
inside consumer function
inside consumer function
after the crit section
inside consumer function
物事が順不同で実行されているように見えるのが正常かどうかはわかりません... 4回実行されていますが、スリープ機能の後に発生するそのprintステートメントに決してヒットしないかどうかがわかります(プロデューサーとコンシューマーの両方に対して)
これは宿題なので、これについてもう少し方向性を探しています...