Variables de condition pour réaliser la synchronisation des threads

(1) Quelle est la variable de condition pour réaliser la synchronisation des threads?
  S'il y a deux threads dans notre programme, l'un est un thread producteur et l'autre est un thread consommateur. Le thread producteur écrit des données dans le tampon tampon à intervalles réguliers. , Et le thread consommateur prend des données du tampon de temps en temps. Pour éviter toute confusion entre les deux threads de lecture et d'écriture, nous laissons le thread de production terminer l'écriture, puis notifions au consommateur de lire les données. Synchronisation.

(2) Deux actions de condition variable
  condition n'est pas satisfaite:
  condition de thread bloqué est satisfaite: avertir le thread bloqué de commencer à travailler

(3) Types de variables de condition:

pthread_cond_t cond;

(4) Fonction principale:
initialiser une variable de condition (le deuxième paramètre est généralement NULL)

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

Détruisez une variable de condition

int pthread_cond_destroy(pthread_cond_t *cond);

Blocage en attente d'une variable de condition

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

       Le fil de blocage
       déverrouille le mutex verrouillé et déverrouille le mutex
       après déverrouillage

Attendre une variable de condition pendant un temps limité

int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);

Activez un thread en attente de cette condition. Lorsqu'il y a plusieurs threads en attente, activez l'un d'eux dans l'ordre de mise en file d'attente.

int pthread_cond_signal(pthread_cond_t *cond);

Réveillez tous les threads bloqués sur les variables de condition

int pthread_cond_broadcast(pthread_cond_t *cond);

 

(5) Précautions

Remarque 1: Le
mutex mutex doit être un verrou ordinaire (PTHREAD_MUTEX_TIMED_NP) ou un verrou adaptatif (PTHREAD_MUTEX_ADAPTIVE_NP).
Avant d'appeler pthread_cond_wait (), ce thread doit verrouiller pthread_mutex_lock ().
Le mutex reste verrouillé jusqu'à ce que la file d'attente de conditions soit mise à jour.
Déverrouillez avant que le fil ne se bloque.
Remarque 2:
Avant que la condition ne soit satisfaite et que vous quittiez pthread_cond_wait (), le mutex sera re-verrouillé pour correspondre à
l'action de verrouillage avant d' entrer pthread_cond_wait ().
En d'autres termes, avant de faire pthread_cond_wait, il est souvent nécessaire d'utiliser pthread_mutex_lock pour verrouiller, et la
fonction pthread_cond_wait déverrouille le verrou, puis suspend le thread. Jusqu'à ce que la condition soit
déclenchée par pthread_cond_signal, la fonction rétablira l'état de verrouillage à l'état verrouillé et
utilisera enfin
pthread_mutex_unlock pour déverrouiller.

Remarque 3:
pthread_cond_wait () et pthread_cond_timedwait () sont implémentés en tant que points d'annulation, ce qui signifie que si
pthread_cond_wait () est annulé, le bloc est quitté, puis l'état de verrouillage est restauré, puis le thread en cours est terminé. Ce
verrou mutex est de retour à l'état, mais le thread courant a été annulé, le mutex ne sera pas résolu, cette
fois le verrou est pas libéré, il provoquera une impasse, ce qui nécessite la sortie de fil avant Déverrouillez-le.

 

(5) Exemple

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

 

Articles de référence pour cet article:

https://www.cnblogs.com/hesper/p/10738996.html

https://www.cnblogs.com/harlanc/p/8596211.html

 

A publié 42 articles originaux · Comme 10 · Visiteurs 10 000+

Je suppose que tu aimes

Origine blog.csdn.net/qq_37659294/article/details/104273874
conseillé
Classement