干杯,
我有两个导致逻辑死锁的线程=>d嫒santa和d嫒patuljak(很抱歉,有些片段是用克罗地亚语写的,我没有时间翻译)
圣诞老人做这个
void d_santa(){ //dodati join!!!
int j;
pthread_mutex_lock(&m);
while(1){
pthread_cond_wait(&u_santa,&m);
if ((br_sob==10)&&(br_patuljak)){
printf ("Dajem poklone i rijesavam se sobova\n");
pthread_cond_broadcast(&u_sob);
sleep(2);
for (j=2; j<=11; j++){
printf ("Pokusavam brisat sob na %d\n",j);
pthread_join(thred[j],NULL);
br_sob--;
printf ("broj sobova=%d\n",br_sob);
}
}
if (br_sob==10){
printf("Hrani nezahvalnu bagru\n");
sleep(2);
}
if ((br_patuljak%3)==0){
pthread_cond_broadcast(&u_patuljak);
printf ("Rijesi problem patuljaka\n");
sleep(1);
for (j=0; j<3; j++){
br_ulaz++;
printf("Oslobađam dretvu %d\n",H_ULAZ);
pthread_join(thred[H_ULAZ],NULL);
br_patuljak--;
}
}
}
pthread_mutex_unlock(&m);
}
dúpatuljak这样做
void d_patuljak(){ //zavrsi implementaciju proizvodac potrosac
pthread_mutex_lock(&m);
br_patuljak++;
printf ("Nastao je patuljak %d\n",br_patuljak);
while(br_patuljak<3){
pthread_cond_wait(&u_patuljak,&m);
}
printf ("Patuljak se oslobodio\n");
if (br_patuljak==3){
pthread_cond_signal(&u_santa);
}
pthread_mutex_unlock(&m);
}
如果有帮助的话,这里也有哭泣
void d_sob(){ //dobar
int id;
pthread_mutex_lock(&m);
id=br_sob+2;
br_sob++;
printf ("Nastao je sob %d\n",br_sob);
while(br_sob<10){
pthread_cond_wait(&u_sob,&m);
}
pthread_cond_signal(&u_santa);
printf ("Sob ceka slobodu %d, a za analizu br_sob=%d\n",id,br_sob);
pthread_mutex_unlock(&m);
}
任务:
圣诞老人只被创造一次,总是保持睡眠或做一些“有用”的事情,而圣诞老人一直被创造,当第三组被创造时,他们叫醒圣诞老人,以便他可以帮助他们解决所有的问题(注意,如果圣诞老人被创造得很快,可以有3个以上的帕图尔雅克,但圣诞老人只需要一组3人!!).
他们不断被创造,直到达到10个,然后他们可以广播(不可能有11个)
我的解决方案(想法):
我将创建1、2、3个patuljaks,每个patuljaks在数组中都有自己的位置。
当patuljak 3被创建时,他会唤醒圣诞老人(也会绕过pthread-cond-wait)!
圣诞老人会醒来,并调用3个连续的pthread cond_信号来释放patuljak 1,patuljak 2,然后patuljak 3=>注意:patuljak 1被释放以结束其线程,然后被pthread_join“破坏”,我将pthread_cond_信号正下方的pthread_join!!
问题是:
pthread_join(patuljak 1)一直在等待patuljak 1,这意味着pthread_cond_signal未能释放patuljak 1(可能是patuljak 2或3)?我不知道解决这个问题的方法,有没有办法知道会发布什么,或者如何发布patuljak 1,2,3?我会使用广播,但我不能帕图尔雅克4将被释放,圣诞老人应该只采取3组。
编辑:我把pthread cond_信号和pthread cond_广播切换到patuljaks,问题没有消失。
不管怎么说,这个节目比这个大得多,我和raindeers有一个类似的问题,我可以尝试广播,但他们也被困在pthread_join,我有一种感觉,如果patuljaks的问题解决了,raindeers(patuljak=>dwarf)xd也会这样。
最佳答案
有两条规则可以解决这些问题:
只有当任何可能正在等待条件变量的线程可以做任何需要做的事情时,才调用pthread_cond_signal
。否则,请始终调用pthread_cond_broadcast
。如有疑问,请致电pthread_cond_broadcast
,因为它总是安全的。
总是在一个循环内调用pthread_cond_wait
,如果出现虚假唤醒,则该循环将再次调用pthread_cond_wait
。你必须设计你的代码,使“额外的”唤醒是无害的,线程只是回去睡觉,如果他们醒来时,他们“不应该”。
关于c - 如何知道pthread_cond_signal释放了哪个线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20458208/