当前位置: 首页 > 编程笔记 >

互斥锁死锁

葛勇锐
2023-03-14
本文向大家介绍互斥锁死锁,包括了互斥锁死锁的使用技巧和注意事项,需要的朋友参考一下

死锁可以在使用互斥锁的多线程Pthread程序中发生。让我们看看它如何发生。未锁定的互斥锁由pthread_mutex_init()函数初始化。

使用pthread_mutex_lock()和pthread_mutex_unlock()获取并释放互斥锁。如果线程尝试获取锁定的互斥锁,则对pthread_mutex_lock()的调用将阻塞线程,直到互斥锁的所有者调用pthread_mutex_unlock()为止。

让我们举个例子,在下面的代码中创建了两个互斥锁-

/* Create and initialize the mutex locks */
pthread mutex t mutex1;
pthread mutex t mutex2; pthread mutex init(&mutex1,NULL);
pthread mutex init(&mutex2,NULL);

接下来,创建两个线程(线程1和线程2),并且这两个线程都可以访问两个互斥锁。线程1和线程2分别在函数dosomework_1和dosomework_2中运行,如下所示:

/* thread1 runs in this function */
void *dosomework_1(void *param) {
   pthread mutex lock(&mutex1);
   pthread mutex lock(&mutex2);
   /**
   * Do some work */
   pthread mutex unlock(& mutex2);
   pthread mutex unlock(& mutex2);
   pthread exit(0); } /*
   thread2 runs in this function
   */ void *dosomework_2(void *param) {
      pthread mutex lock(&mutex2);
      pthread mutex lock(&mutex1);
   /**
   * Do some work */
   pthread mutex unlock(&mutex1);
   pthread mutex unlock(&mutex2);
   pthread exit(0);
}

在此示例中,thread1尝试按顺序获取互斥锁

  • 互斥锁x1,

  • 互斥锁2,

而线程2尝试按顺序获取互斥锁

  • 互斥锁2,

  • 互斥锁x1,

如果线程1获取互斥x1,而线程2获取互斥x2,则可能发生死锁。即使可能发生死锁,如果在线程2尝试获取锁之前,线程1可以获取并释放互斥锁1和互斥锁2的互斥锁,也不会发生死锁。当然,CPU调度程序会调度线程运行的顺序。上面的示例说明了处理死锁的问题:很难识别和测试仅在某些调度情况下才可能发生的死锁。

 类似资料:
  • 本文向大家介绍Python Threading 线程/互斥锁/死锁/GIL锁,包括了Python Threading 线程/互斥锁/死锁/GIL锁的使用技巧和注意事项,需要的朋友参考一下 导入线程包 import threading 准备函数线程,传参数 t1 = threading.Thread(target=func,args=(args,)) 类继承线程,创建线程对象 线程共享全面变量,但在

  • Go语言包中的 sync 包提供了两种锁类型:sync.Mutex 和 sync.RWMutex。 Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 Mutex。 RWMutex 相对友好些,是经典的单写多读模型。在读锁占用的情况下,会阻止写,但不阻止读,也就是多个 gor

  • Introduction This is the fourth part of the chapter which describes synchronization primitives in the Linux kernel and in the previous parts we finished to consider different types spinlocks and semap

  • 9.2. sync.Mutex互斥锁 在8.6节中,我们使用了一个buffered channel作为一个计数信号量,来保证最多只有20个goroutine会同时执行HTTP请求。同理,我们可以用一个容量只有1的channel来保证最多只有一个goroutine在同一时刻访问一个共享变量。一个只能为1和0的信号量叫做二元信号量(binary semaphore)。 gopl.io/ch9/bank

  • 问题内容: 是多线程/进程编程的新手。所以这是我需要澄清的。 处理代码 使用上述伪代码,如果互斥锁未解锁,进程B是否可以访问? 如何从进程B正确访问sharedResource? 有没有清晰的可视化图表说明互斥体,线程和进程之间的关系? 问题答案: 您需要做的是调用pthread_mutex_lock来保护互斥锁,如下所示: 一旦执行此操作,在您在该线程中进行调用之前,不会再进行任何其他调用。因此

  • 问题内容: 帮助客户解决他们遇到的问题。我更多地是sysadmin / DBA的人,所以我在努力帮助他们。他们说这是内核/环境中的错误,在我坚持要在他们的代码中或寻求供应商对OS的支持之前,我试图证明或证明这一点。 发生在Red Hat和Oracle Enterprise Linux 5.7(和5.8)上,应用程序用C ++编写 他们遇到的问题是主线程启动一个单独的线程来执行可能长时间运行的TCP