使用线程从链表中删除元素

时间:2017-11-25 01:28:02

标签: c multithreading linked-list pthreads mutex

我有x个线程,我需要它们从链表中删除元素,但仅当列表不为空时。但是,如果列表为空,我不希望它们死亡,因为我使用命名管道随时添加新元素。我在检查链表是否为空时遇到问题,如果它有1个元素我的所有线程都将进入条件而第二个线程将使程序崩溃。

void threads(){
    while(1){
        if(isEmtpy!=1){
            pthread_mutex_lock(&mutex);       
            //work
            pthread_mutex_unlock(&mutex);
        }
    }
    pthread_exit(NULL);
}

我想我需要更改互斥锁的位置,但如果我把它放在我的if条件之前就不会发生任何事情。

1 个答案:

答案 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的更改也应发生在关键部分。