对互斥锁和解锁的一些解释

时间:2018-05-12 12:46:36

标签: c multithreading locking mutex synchronisation

我现在正在处理进程之间的同步,特别是在互斥和信号量上,所以我找到了一些关于该主题的视频和代码。

我的问题是:

  • 何时将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 :(得分:0)

互斥锁应保护同时使用的变量免受......井...并发访问。

要成功完成此操作,需要在访问变量之前锁定互斥锁。它可以在之后解锁。

这通常与任何函数调用无关(如果不通过并发访问的函数指针完成,则在您显示的代码中不是这种情况)。

参考您的示例,并发访问变量是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;
}