некоторые объяснения блокировки и разблокировки мьютекса - PullRequest
0 голосов
/ 12 мая 2018

Сейчас я работаю над синхронизацией между процессами, особенно с мьютексом и семафором, поэтому я нашел несколько видео и кодов на эту тему.

Мои вопросы:

  • Когда ставить pthread_mutex_lock перед pthread_create вместо того, чтобы помещать его в функцию потока?
  • Приведенный ниже код показывает, что я поставил блокировку перед pthread_create, и когда я снова включил ее в функцию потока, у меня точно такой же результат, так в чем же разница между этими двумя?

Есть ли какая-нибудь книга, из которой я могу выбрать эти вещи, просто дайте ей название.

код:

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

  int T[5];

  pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

  void* fct1(void* arg){
    int i = 0;

    while(i<5){
      //debut de la section critique

      T[i] = 2 * (i+1);
      printf("le thread 1 ecrit : %d\n",T[i]);

      i++;
    }
    pthread_mutex_unlock(&mutex);
    //fin de la section critique
    pthread_exit(NULL);

  }

  void* fct2(void* arg){
    int i = 0;
    //debut de la section critique
    pthread_mutex_lock(&mutex);
    while(i<5){

      printf("le thread 2 li : %d \n",T[i]);

      i++;
    }
    pthread_mutex_unlock(&mutex);
    //fin de la section critique
    pthread_exit(NULL);
  }

  int main (){
    pthread_t T1 , T2 ;
    pthread_mutex_lock(&mutex);
    pthread_create(&T1, NULL, fct1, NULL);
    pthread_create(&T2, NULL, fct2, NULL);

    pthread_join(T1, NULL);
    pthread_join(T2, NULL);

    return 0;
  }

1 Ответ

0 голосов
/ 13 мая 2018

Мьютекс должен защищать одновременно используемую переменную от ... ну ... одновременного доступа.

Чтобы сделать это успешно, мьютекс должен быть заблокирован непосредственно перед тем, как будет доступна переменная. После этого его можно разблокировать.

Как правило, это не связано ни с какими вызовами функций (если это не делается с помощью одновременных обращений к указателям на функции, чего не происходит в показанном вами коде).

Ссылаясь на ваш пример, переменная одновременного доступа имеет вид int T[5].

Итак, код может выглядеть так:

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

int T[5];

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* fct1(void* arg)
{
  int i = 0;

  while(i<5)
  {
    //debut de la section critique
    pthread_mutex_lock(&mutex);

    T[i] = 2 * (i+1);
    printf("le thread 1 ecrit : %d\n",T[i]);

    pthread_mutex_unlock(&mutex);
    //fin de la section critique

    i++;
  }

  pthread_exit(NULL);

}

void* fct2(void* arg){
  int i = 0;

  while(i<5)
  {

    //debut de la section critique
    pthread_mutex_lock(&mutex);

    printf("le thread 2 li : %d \n",T[i]);

    pthread_mutex_unlock(&mutex);
    //fin de la section critique

    i++;
  }

  pthread_exit(NULL);
}


int main ()
{
  pthread_t T1 , T2;

  pthread_create(&T1, NULL, fct1, NULL);
  pthread_create(&T2, NULL, fct2, NULL);

  pthread_join(T1, NULL);
  pthread_join(T2, NULL);

  return 0;
}
...