Я написал код для проблемы со спящим парикмахером, и он выглядит странно ... код выглядит следующим образом ..
#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);
}
Проблема в том, что когда буфер заполнен ... парикмахер ждет клиентов ... но клиент вообще не выполняет !! (он не ожидает и не заполняет буфер) ... потому что клиенты, в то время как цикл был не выполняется ...
void* function (void*)
- person mathematician1975   schedule 28.08.2012customer
? Т.е. выполняется ли перваяprintf
инструкция? Вы пробовали запустить его в отладчике, поставить точку останова вcustomer
и пройти через него, чтобы увидеть, что происходит? - person Some programmer dude   schedule 28.08.2012head
иtail
. Если, конечно, я чего-то не понимаю ... - person mathematician1975   schedule 28.08.2012while(((float)(clock()-g))/CLOCKS_PER_SEC != time_slot[a])
ожидание может быть довольно долгим, если ОС запускается в неподходящее время. Возможно, вам стоит вместо этого протестировать< time_slot[a]
. - person Daniel Fischer   schedule 28.08.2012head
, так иtail
, как вwhile(head==tail)
. - person Bo Persson   schedule 28.08.2012while
пропустит правильное значениеclock()
, он будет зацикливаться, пока не завершится (еслиclock_t
- интегральный тип, конец света, еслиclock_t
тип с плавающей запятой). Использование<
просто немного более защитное. - person Daniel Fischer   schedule 28.08.2012