Linux下的线程同步与互斥

本文介绍了Linux环境下线程同步的基本概念和技术,包括互斥锁、信号量和条件变量等。重点讲解了互斥锁的使用方法及不同类型的互斥锁特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux下线程同步方式:互斥锁、信号量、条件变量
一:线程
1.两个线程进行切换的时机

  当进程从内核态返回用户态的时候,操作系统会自动检测是否要进行线程切换。
   root在操作系统态时拥有最高权限,但是不能让root去运行用户代码,操作系统认为用户代码是不安全的。
   在调用接口时,因为接口是操作系统提供的,所以就要切换用户态为内核态方可调用接口。(权限必须切换到内核态)。

二:访问临界资源
在访问临界资源时,一定要保证访问临界资源的原子性。
保证共享资源数据操作的完整性,任何时间只能有一个线程访问临界资源。
互斥锁(mutex):完成互斥功能
  锁机制是同一时刻只允许一个线程执行一个关键部分的代码。
线程必须先获得互斥锁才能访问临界资源,访问该临界资源后释放该锁,如果无法获得锁线程就会一直等待直到获得锁为止。
互斥锁的使用:
创建—加锁—解锁 要明白什么时候加锁,什么时候解锁。
互斥锁也是一种临界资源,所以加锁和解锁也是原子的(既然互斥锁是用来保护临界资源的原子性,在保护别人安全下一定要先保证自己是安全的)。
某种程度上来说互斥锁相当于二元信号量,只不过二元信号量是用于进程的,互斥锁是用于线程的。

1. 初始化锁
  int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
   其中参数 mutexattr 用于指定锁的属性(见下),如果为NULL则使用缺省属性。
   互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前有四个值可供选择:
   (1)PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。
   (2)PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。
   (3)PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。
   (4)PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。

 2. 阻塞加锁
  int pthread_mutex_lock(pthread_mutex *mutex);
 3. 非阻塞加锁
   int pthread_mutex_trylock( pthread_mutex_t *mutex);
   该函数语义与 pthread_mutex_lock() 类似,不同的是在锁已经被占据时返回 EBUSY 而不是挂起等待。
 4. 解锁(要求锁是lock状态,并且由加锁线程解锁)
  int pthread_mutex_unlock(pthread_mutex *mutex);
 5. 销毁锁(此时锁必需unlock状态,否则返回EBUSY)
  int pthread_mutex_destroy(pthread_mutex *mutex);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值