【发布时间】:2012-08-28 12:53:08
【问题描述】:
我编写了睡眠理发师问题的代码,看起来很奇怪...... 代码如下..
#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 循环没有执行...
【问题讨论】:
-
你的线程函数原型应该是
void* function (void*) -
这不可能是死锁,因为你从来没有在我能看到的任何地方真正锁定你的互斥锁
-
它是否输入
customer? IE。第一个printf语句是否被执行?您是否尝试过在调试器中运行它,在customer中放置一个断点并单步执行以查看发生了什么? -
您正在修改 2 个未同步的全局变量,这些变量用于控制循环逻辑。您的代码无法以有意义的方式进行预测。当您更改
head和tail时,您或许应该考虑使用互斥锁来保护您的代码。当然,除非我在这里完全误解了某些东西...... -
@nitish712 (非常)不太可能发生,但是如果
while错过了正确的clock()值,它将循环直到它换行(如果clock_t是一个整数类型,如果@ 是世界末日987654331@ 是浮点类型)。使用<只是更具防御性。
标签: c multithreading deadlock