2013-09-30 35 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); 
    } 
} 

我得到的是一个段错误,因为我的列表在第一个元素删除后没有任何元素。但我的线程正在锁定并检查它 是否有任何其他方式使用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 = 1addfunction之前,您需要锁定互斥锁。

如果要做的事情的真正含义起飞名单也许你应该使用flag_TO_go变量来检查一个不空列表,而不是项。

此外,您将这两个函数中的标志设置为1,我不明白这一点。你确定这是对的吗?

+0

是的,我初始化flag_To_go 0全局所以每当信号到来。删除功能将获得锁并执行删除。我在将标志设置为1之前将互斥锁锁定。 是否有任何其他方式使用cond wait – user2825892

+0

@ user2825892:是的,将其全局设置为0会发生一次。设置为1后,它在哪里设置为0? –

+0

我不会将它更改为0。因为一旦我的名单得到了所有元素,我的线程(addfucntion)退出及deletefunction(线程)附加有权删除,直到空的元素。所以这里的情况是,如果我一个操作之后使flag_to_go = 0就不会再次检查列表(和信号线,现在已经死了),如果我让1.它开始检查的元素,他们得到附加之前。 – user2825892