c - 互斥锁和解锁的一些解释

标签 c multithreading locking mutex synchronization

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

我的问题是:

  • 何时将 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;
  }

最佳答案

互斥锁应保护并发使用的变量免受......好吧..并发访问。

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

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

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

关于c - 互斥锁和解锁的一些解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50306420/

相关文章:

java - onPostExecute 没有被调用

c# - 遇到锁时如何停止线程?

c - 第一次使用 select(),可能是一个基本问题?

c - 如何循环访问结构成员?

c - 如何将 C 代码编译为原始的无操作系统二进制文件?

multithreading - 对无锁与锁定数据结构进行基准测试的正确方法

hibernate - 如何在 JPA 实体管理器中锁定整个实体(表)

c - 在c中定位数组中的颜色

c# - 仅当调用Application.Run()WPF应用程序时,代码才会启动

ios - 异步调用时 UI 元素在 Segue 后缺少文本