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