0

在此处的此链接中,在增量函数中,条件变量在实际增加计数(从零开始)之前发出信号。增加计数后是否不应该调用信号?或者,直到在 increment_function 中释放互斥锁后,decrement_count 函数中的等待调用才会返回?

pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count;

decrement_count()
{
    pthread_mutex_lock(&count_lock);
    while (count == 0)
        pthread_cond_wait(&count_nonzero, &count_lock);
    count = count - 1;
    pthread_mutex_unlock(&count_lock);
}

increment_count()
{
    pthread_mutex_lock(&count_lock);
    if (count == 0)
        pthread_cond_signal(&count_nonzero);
    count = count + 1;
    pthread_mutex_unlock(&count_lock);
}
4

2 回答 2

2

由于互斥锁,在信号之前或之后执行都没有关系,因为在互斥锁解锁之前无法读取变量。

于 2012-12-08T08:23:58.697 回答
1

正如Troy 所说,在递增之前发出条件变量的信号counter很好,因为这些操作都是在持有互斥锁的情况下完成的。

但是,如果多个线程可以在decrement_count(). 考虑两个线程在 中挂起的情况pthread_cond_wait(),其中count == 0. 现在,increment_count()连续调用两次(可能由同一个线程) -count递增到2,因为它应该是,但条件变量只发出一次信号。这意味着只有一个等待的线程被唤醒,而另一个将无限期地等待,即使它counter是非零的。

可以通过多种方式修复此错误:

  • 替换pthread_cond_signal()pthread_cond_broadcast()in increment_count(); 或者
  • 无条件呼唤pthread_cond_signal()increment_count()或者
  • 在 中递减后调用pthread_cond_signal()ifcount非零decrement_count()

一般来说,请记住使用pthread_cond_signal()代替pthread_cond_broadcast()是一种优化,您应该仔细分析算法在使用时是否仍然正确。

于 2012-12-11T06:13:41.337 回答