Variável de condição Pthread e sem deadlock

concorrente

Quando estava procurando o tópico, encontrei o código daqui . Como você pode ver, os dois threads de funções usam o mesmo mutex. Então, como a outra thread pode ser sinalizada ou pegar o sinal e continuar sua função mesmo se a thread anterior possuir mutex? Como / por que não existe um impasse? É um pouco confuso.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t count_mutex     = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  condition_var   = PTHREAD_COND_INITIALIZER;

void *functionCount1();
void *functionCount2();
int  count = 0;
#define COUNT_DONE  10
#define COUNT_HALT1  3
#define COUNT_HALT2  6

main()
{
   pthread_t thread1, thread2;

   pthread_create( &thread1, NULL, &functionCount1, NULL);
   pthread_create( &thread2, NULL, &functionCount2, NULL);

   pthread_join( thread1, NULL);
   pthread_join( thread2, NULL);

   printf("Final count: %d\n",count);

   exit(EXIT_SUCCESS);
}

// Write numbers 1-3 and 8-10 as permitted by functionCount2()

void *functionCount1()
{
   for(;;)
   {
      // Lock mutex and then wait for signal to relase mutex
      pthread_mutex_lock( &count_mutex );     //     <---- Same mutex

      // Wait while functionCount2() operates on count
      // mutex unlocked if condition varialbe in functionCount2() signaled.
      pthread_cond_wait( &condition_var, &count_mutex );
      count++;
      printf("Counter value functionCount1: %d\n",count);

      pthread_mutex_unlock( &count_mutex );

      if(count >= COUNT_DONE) return(NULL);
    }
}

// Write numbers 4-7

void *functionCount2()
{
    for(;;)
    {
       pthread_mutex_lock( &count_mutex );    //     <---- Same mutex

       if( count < COUNT_HALT1 || count > COUNT_HALT2 )
       {
          // Condition of if statement has been met. 
          // Signal to free waiting thread by freeing the mutex.
          // Note: functionCount1() is now permitted to modify "count".
          pthread_cond_signal( &condition_var );
       }
       else
       {
          count++;
          printf("Counter value functionCount2: %d\n",count);
       }

       pthread_mutex_unlock( &count_mutex );

       if(count >= COUNT_DONE) return(NULL);
    }

}
Tony

Se um thread possui o bloqueio, o outro não pode adquiri-lo antes que o outro o libere.
Agora, se o encadeamento A adquiriu o bloqueio primeiro, impedirá que o encadeamento B avance na seção crítica até que o bloqueio seja liberado.


Por que não existe um impasse?


Lendo isso :

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

Esta função libera atomicamente o mutex e faz com que o thread de chamada seja bloqueado na variável de condição cond;

O thread A irá liberar o bloqueio quando atingir o cond_waite o thread B pode progredir e sinalizar a variável de condição.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Por que POSIX padroniza semáforo como chamada de sistema, mas deixa mutex e variável de condição para Pthread (nível de usuário)

Por que POSIX padroniza semáforo como chamada de sistema, mas deixa mutex e variável de condição para Pthread (nível de usuário)

É possível usar a variável de condição pthread (pthread_mutex e pthread_cond_t) com várias condições?

variável de condição de thread de deadlock c ++

Semântica de variável de condição C ++ 11

Variável de condição C ++ sem tempo limite

Variável de condição C ++ sem tempo limite

C - variáveis de condição pthread

Variável de condição POSIX e "competição" mutex

Por que a variável de condição pthread não funciona

tkinter.TclError: sem nome de exibição e sem variável de ambiente $ DISPLAY python

DietPI: _tkinter.TclError: sem nome de exibição e sem variável de ambiente $ DISPLAY

Variável de condição e mutex compartilhado

Diferença entre variável de condição e predicado de condição na sincronização java

Erro do compilador ao declarar uma variável dentro da condição if e sem chaves

Semáforos vs. variáveis de condição - nível de abstração

Função de Golang e semântica de variável de função

Quando usar variáveis de condição pthread?

Recursão Python com e sem o uso de variável global

Visualização sem atualização na mudança de variável em Ionic 2 e Angular 2

Por que é possível atualizar variáveis atômicas simultaneamente sem condição de corrida em Java?

Vazamento de thread detectado ao usar a variável de condição em vez de join() com pthread

comportamento elenco desmarcada com e sem atribuição de variável

Destruição de objeto em TS com e sem variável explícita

Qual é a diferença entre a declaração de uma variável com "!" e sem "!"?

ativação periódica de thread sem usar a variável de condição ou função de suspensão

Variável ReeantrantLock e condição

Plotar geom_area sem linhas de preenchimento e coloração por variável / ou geom_line sem sobreposição de variáveis

Relação de bloqueio exclusivo, mutex e variável de condição em c ++

TOP lista

quentelabel

Arquivo