关于pthread_cond_wait?

时间:2016-08-31 14:39:44

标签: c++ c multithreading pthreads

我有以下代码:

typedef struct {
...
    volatile int i_lines_completed;
    pthread_mutex_t mutex;
    q265_pthread_cond_t cv;
...
}q265_picture_t;
void q265_frame_cond_broadcast( q265_picture_t *frame, int i_lines_completed )
{
    pthread_mutex_lock( &frame->mutex );
    frame->i_lines_completed = i_lines_completed;
    pthread_cond_broadcast( &frame->cv );
    pthread_mutex_unlock( &frame->mutex );
}
void q265_frame_cond_wait( q265_picture_t *frame, int i_lines_completed )
{
    pthread_mutex_lock( &frame->mutex );
    while( frame->i_lines_completed < i_lines_completed )
        pthread_cond_wait( &frame->cv, &frame->mutex );
    pthread_mutex_unlock( &frame->mutex );
}

用例是:

多个线程可以调用q265_frame_cond_wait来请求该帧具有所需的i_lines_completed,而只有一个线程调用q265_frame_cond_broadcast来广播i_lines_completed。< / p>

问题是:

多个线程同步调用q265_frame_cond_wait是否有效?

当某个线程调用q265_frame_cond_broadcast时,

  • 所有等待的线程是否会同步获取互斥锁?
  • 或者他们必须竞争才能获得互斥锁?

另一个问题: 但两个pthread_cond_t只共享一个互斥锁是对的吗?例如,以下代码,两个pthread_cond_t is_fill和is_empty共享唯一的一个互斥锁,并且线程可能会同步调用q265_framelist_cond_wait0和q265_framelist_cond_wait1。

typedef struct {
...
    volatile int i_size;
    pthread_mutex_t mutex;
    q265_pthread_cond_t is_fill, is_empty;
...
}q265_picture_list_t;
void q265_framelist_cond_wait0( q265_picture_list_t *framelist)
{
    pthread_mutex_lock( &framelist->mutex );
    while( framelist->i_size <= 0)
        pthread_cond_wait( &framelist->is_fill, &framelist->mutex );
    pthread_mutex_unlock( &framelist->mutex );
}
void q265_framelist_cond_wait1( q265_picture_list_t *framelist)
{
    pthread_mutex_lock( &framelist->mutex );
    while( framelist->i_size == max_size)
        pthread_cond_wait( &framelist->is_empty, &framelist->mutex );
    pthread_mutex_unlock( &framelist->mutex );
}

1 个答案:

答案 0 :(得分:2)

  

问题是:多个线程同步调用q265_frame_cond_wait是否有效

多个线程可以调用q265_frame_cond_wait,没有竞争条件。

  

q265_frame_cond_broadcast,所有等待的线程是否会同步获取互斥锁?

pthread_cond_broadcast唤醒当前在条件变量上等待的所有线程。只有一个线程可以一次锁定一个互斥锁,这样这些被唤醒的线程在锁定互斥锁时排队。

  

或者他们必须竞争获得互斥量?

从概念上讲,pthread_cond_wait必须在返回时锁定互斥锁。这被称为thundering herd problem

Linux通过将条件变量上的服务器队列移动到互斥锁上的服务器队列来解决此问题,以避免唤醒随后会立即在互斥锁上阻塞的线程。这称为等待变形