2013-09-30 3 views
1

Я новичок в многопоточности и застревает с ошибкой сегментации. Я используюpthread_cond_broadcast без занятости в POSIX

void addfunction(void *xyz) 
{ 
    flag_TO_go = 1; 
    pthread_cond_broadcast(&check_Queue2); 
    pthread_mutex_unlock(&get_mutex); 
} 

void delete_thread(void *abc) 
{ 
    while(1){ 
     pthread_mutex_lock(&get_mutex); 
     while (!flag_TO_go) {//condition variable 
      pthread_cond_wait(&check, &get_mutex); 
     } 
     flag_To_go= 1; 
     //things to do 
     //delete elemenst from a linked list 
     pthread_mutex_unlock(&get_mutex); 
    } 
} 

Что я получаю ошибку сегментации, потому что мой список не имеет какой-либо элемент после первого удаления элемента. но мой поток aqcquiring lock и проверка его Есть ли другой способ использования cond wait.

Если кто-нибудь может предложить способ сделать это без ожиданного ожидания?

ответ

0

Попробуйте это ..

void addfunction(void *xyz) 
{ 
    pthread_mutex_lock(&get_mutex); 
    flag_TO_go = 1; 
    pthread_cond_broadcast(&check_Queue2); 
    pthread_mutex_unlock(&get_mutex); 
} 

void delete_thread(void *abc) 
{ 
    while(1){ 
     pthread_mutex_lock(&get_mutex); 
     while (!flag_TO_go) {//condition variable 
      pthread_cond_wait(&check, &get_mutex); 
     } 
     flag_To_go= 0; 
     //things to do 
     //delete elemenst from a linked list 
     pthread_mutex_unlock(&get_mutex); 
    } 
} 
1

Перед установкой flag_TO_go = 1 необходимо заблокировать мьютексы в addfunction.

И если что-то делать, это значит, что вы должны взять элементы из списка, возможно, вы должны проверять непустой список вместо использования переменной flag_TO_go.

Кроме того, вы устанавливаете флаг 1 в обе функции, которые я не понимаю. Вы уверены, что это правильно?

+0

Да, я инициализирован flag_To_go до 0 во всем мире так, когда приходит сигнал. Функция Delete получит блокировку и выполнит удаление. Я устанавливаю блокировку мьютекса перед установкой флага на 1. есть ли другой способ использования cond wait – user2825892

+0

@ user2825892: Да, установка его глобально на 0 происходит один раз. Где он устанавливается в 0 после установки 1? –

+0

Я не меняю его на 0. потому что, как только список будет добавлен со всеми элементами, мой поток (addfucntion) выйдет и удалит функцию (поток), должен удалить элементы до пустых. Итак, ситуация такова, что если я сделаю flag_to_go = 0 после одной операции, он не будет проверять список снова (и поток сигналов уже мертв), и если я сделаю это, то он начнет проверку элементов до их добавления. – user2825892

Смежные вопросы