我有x个线程,我需要它们从链表中删除元素,但仅当列表不为空时。但是,如果列表为空,我不希望它们死亡,因为我使用命名管道随时添加新元素。我在检查链表是否为空时遇到问题,如果它有1个元素我的所有线程都将进入条件而第二个线程将使程序崩溃。
void threads(){
while(1){
if(isEmtpy!=1){
pthread_mutex_lock(&mutex);
//work
pthread_mutex_unlock(&mutex);
}
}
pthread_exit(NULL);
}
我想我需要更改互斥锁的位置,但如果我把它放在我的if条件之前就不会发生任何事情。
答案 0 :(得分:0)
将锁定移得更高,以保护isEmpty
变量也应该足够
void threads(){
while(1){
pthread_mutex_lock(&mutex);
if(isEmtpy!=1){
//work
isEmpty = hasElements(list) ? 0 : 1;
}
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
isEmpty
的更改也应发生在关键部分。