2016-08-31 3 views
3

I次のコードを持っている:pthread_cond_waitについて

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

ユースケースは次のとおりです。

1つのスレッドだけにq265_frame_cond_broadcastを呼び出している間、フレームがi_lines_completedを必要としていることを要求するためにq265_frame_cond_waitを呼び出すことができ、複数のスレッドi_lines_completedをブロードキャストします。

質問です:?

は、それが複数のスレッドが同期q265_frame_cond_waitを呼び出すこと有効です

特定のスレッドがq265_frame_cond_broadcastを呼び出し、

  • すべての待機中のスレッドは同期ミューテックスを取得します?
  • または、彼らはミューテックスを得るために競争しなければなりませんか?

別の問題: しかし、2つのpthread_cond_tが1つのミューテックスを共有しているのは正しいですか?たとえば、次のコードでは、2つのpthread_cond_t is_fillとis_emptyが1つのミューテックスを共有し、スレッドはおそらく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); 
} 
+2

はい、 'pthread_cond_broadcast'について読むと、複数のスレッドがある条件で待機できることが暗示されています。ミューテックスは、スレッドが 'pthread_cond_wait'にある間にロックが解除されるので、そこでは問題がないのを待ちます。その後、彼らは相互にミューテックスをリリースするのを待たなければなりません – Hayt

答えて

2

質問がある:それはいくつかのスレッドが複数のスレッドがq265_frame_cond_waitを呼び出すことができます

同期q265_frame_cond_waitを呼び出すことは有効ですが、何の競合状態がありません。

q265_frame_cond_broadcast、待機中のスレッドはすべて同期してミューテックスを取得しますか?

pthread_cond_broadcastは、現在条件変数で待機しているすべてのスレッドを起動します。一度に1つのスレッドだけがmutexをロックすることができるので、これらの起動されたスレッドはmutexのロック時にキューに入れられます。

または、彼らはミューテックスを得るために競争する必要がありますか?

概念的には、pthread_cond_waitは、復帰時にミューテックスをロックする必要があります。これはthundering herd problemとして知られています。

Linuxでは、条件変数のウェイターのキューをミューテックスのウェイターのキューに移動することで、この問題を解決します。これはとして知られており、モーフィング待ちですです。

関連する問題