我写了睡眠理发师问题的代码,看起来很奇怪...... 代码如下..
#include<stdlib.h>
#include<stdio.h>
#include<pthread.h>
#define MAX_C 10
int a[MAX_C], head=0, tail=0, tmp, tb, tc, count=1;
pthread_mutex_t B;
double time_slot[]={0.125,0.5,0.75,1.00,1.25,1.50,1.75,2.00};
void wait(int a)
{
clock_t g=clock();
while(((float)(clock()-g))/CLOCKS_PER_SEC != time_slot[a]);
}
void barber()
{
printf("barber started\n");
while(1) {
tmp=0;
while(head==tail) {
printf("b\n");
}
tb=rand()%8;
printf("tail:%d\n", tail);
tail=(tail+1)%MAX_C;
wait(tb);
}
}
void customer()
{
printf("customers started\n");
while(1) {
wait(rand()%8);
while((head+1)%MAX_C == tail) {
printf("c\n");
}
a[head]=count-1;
printf("head:%d\n", head);
head=(head+1)%MAX_C;
}
}
int main(int argc, char* argv[])
{
pthread_t b,c;
pthread_mutex_init(&B, NULL);
pthread_create(&c, NULL, (void*)&customer, NULL);
pthread_create(&b, NULL, (void*)&barber, NULL);
pthread_join(b, NULL);
pthread_join(c, NULL);
exit(0);
}
问题在于,当缓冲区已满时......理发师正在等待客户......但客户根本没有执行!!(它既没有等待也没有填充缓冲区)...因为顾客while循环没有执行...
答案 0 :(得分:0)
正如Daneil Fischer所说...... while(((float)(clock()-g))/CLOCKS_PER_SEC != time_slot[a]);
有一个错误我应该用
while(((float)(clock()-g))/CLOCKS_PER_SEC <= time_slot[a]);
但是仍然很奇怪,只有在整个缓冲区被填满之后才会出现这个'缺失'的时钟值....
答案 1 :(得分:0)
执行程序使用CPU的信号量存在问题
请查看您是否正在使用信号量。 别忘了#include
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
// The maximum number of customer threads.
#define MAX_CUSTOMERS 25
</b>
void *customer(void *number) {
int num = *(int *)number;
// Leave for the shop and take some random amount of
// time to arrive.
printf("Customer %d leaving for barber shop.\n", num);
randwait(5);
printf("Customer %d arrived at barber shop.\n", num);
// Wait for space to open up in the waiting room...
sem_wait(&waitingRoom);
printf("Customer %d entering waiting room.\n", num);
// Wait for the barber chair to become free.
sem_wait(&barberChair);
// The chair is free so give up your spot in the
// waiting room.
sem_post(&waitingRoom);
// Wake up the barber...
printf("Customer %d waking the barber.\n", num);
sem_post(&barberPillow);
// Wait for the barber to finish cutting your hair.
sem_wait(&seatBelt);
// Give up the chair.
sem_post(&barberChair);
printf("Customer %d leaving barber shop.\n", num);
}
void *barber(void *junk) {
// While there are still customers to be serviced...
// Our barber is omnicient and can tell if there are
// customers still on the way to his shop.
while (!allDone) {
// Sleep until someone arrives and wakes you..
printf("The barber is sleeping\n");
sem_wait(&barberPillow);
// Skip this stuff at the end...
if (!allDone) {
// Take a random amount of time to cut the
// customer's hair.
printf("The barber is cutting hair\n");
randwait(3);
printf("The barber has finished cutting hair.\n");
// Release the customer when done cutting...
sem_post(&seatBelt);
}
else {
printf("The barber is going home for the day.\n");
}
}
}