(1)スレッド同期を実現するための条件変数は何ですか?
プログラムに2つのスレッドがあり、一方がプロデューサースレッドで、もう一方がコンシューマースレッドである場合、プロデューサースレッドはデータをバッファーバッファーに定期的に書き込みます。 、そしてコンシューマスレッドは時々バッファからデータを取得します。2つのスレッドの読み取りと書き込みの混乱を避けるために、プロダクションスレッドに書き込みを終了させ、データを読み取るようコンシューマに通知します。その後、条件変数を使用してスレッドを実装できます。同期。
(2)条件変数の
条件の2つのアクションが満たされていない:ブロックされたスレッドの
条件が満たされている:ブロックされたスレッドに通知して動作を開始する
(3)条件変数のタイプ:
pthread_cond_t cond;
(4)メイン関数:
条件変数を初期化します(2番目のパラメーターは通常NULLです)
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
条件変数を破棄する
int pthread_cond_destroy(pthread_cond_t *cond);
条件変数を待っているブロッキング
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
ブロッキングスレッド
は、ロックされたミューテックスをロック解除し、ロック解除
後にミューテックスをロック解除します
条件変数を一定時間待機します
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);
この状態を待機しているスレッドをアクティブ化します。待機しているスレッドが複数ある場合は、エンキュー順に1つをアクティブ化します。
int pthread_cond_signal(pthread_cond_t *cond);
条件変数でブロックされたすべてのスレッドを起動します
int pthread_cond_broadcast(pthread_cond_t *cond);
(5)注意事項
注1:
mutex mutexは、通常のロック(PTHREAD_MUTEX_TIMED_NP)または適応ロック(PTHREAD_MUTEX_ADAPTIVE_NP)でなければなりません。
pthread_cond_wait()を呼び出す前に、このスレッドはpthread_mutex_lock()をロックする必要があります。
ミューテックスは、条件待ちキューが更新されるまでロックされたままです。
スレッドが待機状態になる前にロックを解除します。
注2:
条件が満たされ、pthread_cond_wait()を終了する前に、ミューテックスは
pthread_cond_wait()に入る前のロックアクションに対応するように再ロックされます。
つまり、pthread_cond_waitを実行する前に、pthread_mutex_lockを使用してロックする必要があることが多く、
pthread_cond_wait関数はロックを解除してから、スレッドを中断します。条件が
pthread_cond_signal によってトリガーされるまで、関数はロック状態をロック状態に復元し、最後に
pthread_mutex_unlockを使用してロックを解除します。
注3:
pthread_cond_wait()とpthread_cond_timedwait()の両方がキャンセルポイントとして実装されています。つまり、
pthread_cond_wait()がキャンセルされると、ブロックが終了し、ロック状態が復元されて、現在のスレッドが終了します。その
ミューテックスロック状態に戻ったが、現在のスレッドがキャンセルされた場合、ミューテックスが解決されることはありません、この
時間は、ロックが解除されていない、それはこのように前にスレッドが終了を必要とする、デッドロックが発生しますロックを解除します。
(5)例
1.初始化条件变量和互斥锁
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
2.在线程中使用
(1)生产者线程
pthread_mutex_lock(&mutex);// 使用互斥锁保护共享数据
对缓冲区buffer写入操作
pthread_cond_signal(&cond);// 通知阻塞的消费者线程,数据写入完毕,可以解除阻塞了
pthread_mutex_unlock(&mutex);
(2)消费者线程
pthread_mutex_lock(&mutex); //调用pthread_cond_wait前一般都会搭配pthread_mutex_lock
pthread_cond_wait(&cond, &mutex); //等待生产者线程的通知
从缓冲区buffer中读出数据
pthread_mutex_unlock(&mutex); //解锁
3.销毁条件变量和互斥锁
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
この記事の参考記事:
https://www.cnblogs.com/hesper/p/10738996.html
https://www.cnblogs.com/harlanc/p/8596211.html