linux进程间同步——互斥锁与条件变量

本文介绍了Linux环境下,进程间同步的两种重要机制:互斥锁和条件变量。互斥锁用于保护资源的独占访问,防止数据竞争;条件变量则用于线程在特定条件满足时进行等待和被其他线程通知唤醒。详细讲解了互斥锁的创建、加/解锁及属性,以及条件变量的创建、等待与通知操作。在条件不满足时,持有锁的线程会进入等待状态,当条件满足(如变量X由0变为非0)时,会唤醒等待的线程。

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

互斥锁

  1. 创建
//互斥锁是静态分配的(不是动态申请的)
static pthread_mutex_t mutex_lock = PETHREAD_MUTEX_INITIALIZER;
  1. 加/解锁
#include <prhread.h>

int pthread_mutex_lock(pthread_mutex_t *mutex_lock);
int pthread_mutex_trylock(pthread_mutex_t *mutex_lock);
					//如果互斥锁被锁住,返回 EBUSY
int pthread_mutex_unlock(pthread_mutex_t *mutex_lock);

					//success:return 0; or return !0
  1. 互斥锁属性
#include <prhread.h>
//创建属性
int pthread_mutexattr_init(pthread_mutexattr_t *mutex_attr);
int pthread_mutexattr_destroy(pthread_mutexattr_t *mutex_attr);

//以自定义互斥锁属性初始化互斥锁
int pthread_mutex_init(pthread_mutex_t *mutex_lock, const pthread_mutexattr_t *mutex_attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex_lock);

条件变量

互斥锁是用来上锁的,条件变量是用来等待和通知的

  1. 创建
//条件变量是静态分配的(不是动态申请的)
static pthread_cond_t cond_lock = PETHREAD_COND_INITIALIZER;
  1. 等待与通知
int pthread_cond_wait(pthread_cond_t *cond_lock, thread_mutex_t *mutex_lock);
		//释放互斥锁 mutex_lock,进入等待状态,等待cond_lock上的通知信号
int pthread_cond_signal(pthread_cond_t *cond_lock);
		//通知cond_lock 上等待的其中一个线程
  1. 属性
//创建属性
int pthread_condattr_init(pthread_condattr_t *cond_attr);
int pthread_condattr_destroy(pthread_condattr_t *cond_attr);

//以自定义条件变量属性初始化互斥锁
int pthread_cond_init(pthread_cond_t *cond_lock, const pthread_condattr_t *cond_attr);
int pthread_cond_destroy(pthread_cond_t *cond_lock);

使用方法

  1. 当持有互斥锁后,发现后面代码运行条件不满足时,进入等待
//假设:X != 0时,后面代码可运行

if(0 == pthread_mutex_lock(pthread_mutex_t *mutex_lock))
	ERROR;
while(X == 0)
	pthread_cond_wait(pthread_cond_t *cond_lock, thread_mutex_t *mutex_lock);
  1. 如果发现X = 0, 则说明有线程可能进入等待,当X ++后,唤醒线程
int sign = 0;
if(0 == pthread_mutex_lock(pthread_mutex_t *mutex_lock))
 ERROR;
if(X == 0)
	sign = 1;

X++if(0 == pthread_unmutex_lock(pthread_mutex_t *mutex_lock))
 ERROR;

if(sign)
	pthread_cond_signal(pthread_cond_t *cond_lock);
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值