【问题标题】:pthread_cond_broadcast without busy wait in POSIXpthread_cond_broadcast 在 POSIX 中没有忙等待
【发布时间】:2013-09-30 08:58:13
【问题描述】:

我是多线程新手,遇到了分段错误。我正在使用

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 。

如果有人可以建议一种无需忙碌等待的方法吗?

【问题讨论】:

    标签: c multithreading pthreads posix


    【解决方案1】:

    addfunction中设置flag_TO_go = 1之前需要锁定互斥锁。

    如果要做的事情真的意味着从列表中删除项目,那么也许您应该检查一个非空列表而不是使用 flag_TO_go 变量。

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

    【讨论】:

    • 是的,我在全局范围内将 flag_To_go 初始化为 0,因此每当信号到来时。删除函数将获取锁并执行删除。我在将标志设置为 1 之前放置了互斥锁。有没有其他方法可以使用 cond wait
    • @user2825892:是的,将其全局设置为 0 会发生一次。设置为 1 后在哪里设置为 0?
    • 我不会将其更改为 0 。因为一旦我的列表附加了所有元素,我的线程(addfucntion)就会退出并且deletefunction(thread)必须删除元素直到为空。所以这里的情况是,如果我在一次操作后使 flag_to_go = 0,它将不会再次检查列表(并且信号线程现在已经死了),如果我将其设置为 1.它在元素被附加之前开始检查它们。
    【解决方案2】:

    试试这个..

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 2014-04-24
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      相关资源
      最近更新 更多