Linux C 中4种互斥锁简述

这篇博客介绍了Linux C编程中四种类型的互斥锁:普通锁、检错锁、嵌套锁和默认锁,并通过具体例子阐述了死锁的情况,包括不同线程顺序加锁、同一线程重复加锁和互斥锁访问顺序导致的死锁问题,还讨论了多线程程序调用fork引发的死锁分析。
摘要由CSDN通过智能技术生成

1.互斥锁类型

1.普通锁 (PTHREAD_MUTEX_NORMAL)

互斥锁默认类型。当一个线程对一个普通锁加锁以后,其余请求该锁的线程将形成一个等待队列,并在该锁解锁后按照优先级获得它,这种锁类型保证了资源分配的公平性。一个线程如果对一个已经加锁的普通锁再次加锁,将引发死锁;
对一个已经被其他线程加锁的普通锁解锁,或者对一个已经解锁的普通锁再次解锁,将导致不可预期的后果。

2.检错锁(PTHREAD_MUTEX_ERRORCHECK)

一个线程如果对一个已经加锁的检错锁再次加锁,则加锁操作返回EDEADLK;
对一个已经被其他线程加锁的检错锁解锁或者对一个已经解锁的检错锁再次解锁,则解锁操作返回EPERM;

3.嵌套锁(PTHREAD_MUTEX_RECURSIVE)

该锁允许一个线程在释放锁之前多次对它加锁而不发生死锁;
其他线程要获得这个锁,则当前锁的拥有者必须执行多次解锁操作;
对一个已经被其他线程加锁的嵌套锁解锁,或者对一个已经解锁的嵌套锁再次解锁,则解锁操作返回EPERM

4.默认锁(PTHREAD_MUTEX_ DEFAULT)

一个线程如果对一个已经加锁的默认锁再次加锁,或者虽一个已经被其他线程加锁的默认锁解锁,或者对一个解锁的默认锁解锁,将导致不可预期的后果;
这种锁实现的时候可能被映射成上述三种锁之一;

2.死锁举例

1.不同线程申请普通锁,将按照顺序依次申请锁并加锁

#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int count = 0;
void * thread_func_one(void *arg)
{
   int i;
   for(i=0;i<10;i++){
     pthread_mutex_lock( &mutex1);
     count++;
     sleep(1);
     pthread_mutex_unlock(&mutex1);
     printf("thread one count value is %d/n",count);
   }
   return NULL;
}
void * thread_func_two(void *arg)
{
   int i;
   for(i=0;i<10;i++){
     pthread_mutex_lock( &mut
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值