スレッド同期を実現するための条件変数

(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

 

42件のオリジナル記事を公開 いいね10 10,000人以上の訪問者

おすすめ

転載: blog.csdn.net/qq_37659294/article/details/104273874