C++ 关于pthread\u cond\u wait?

C++ 关于pthread\u cond\u wait?,c++,c,multithreading,pthreads,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( &

我有以下代码:

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\u frame\u cond\u wait是否有效

多个线程可以调用
q265\u frame\u cond\u wait
,不存在争用条件

q265\u frame\u cond\u broadcast
,所有等待线程是否会同步获取互斥锁

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

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

概念上是的,
pthread\u cond\u wait
必须在返回时锁定互斥锁。这就是我们所知道的


Linux通过将条件变量上的等待者队列移动到互斥体上的等待者队列来解决这个问题,以避免唤醒线程,这些线程随后会立即在互斥体上被阻塞。这就是所谓的等待变形。

是的,如果您阅读了关于
pthread\u cond\u broadcast
的内容,则意味着多个线程可以在一个条件下等待。当线程处于
pthread\u cond\u wait
状态时,互斥锁将被解锁,因此当线程处于等待状态时,不会出现任何问题。之后和之前,他们必须等待对方释放互斥锁
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 );
}