多线程之锁

本文介绍了锁的使用,包括初始化与去初始化,使用pthread_mutex_init初始化互斥锁,pthread_mutex_destroy销毁锁;还介绍了加锁与解锁操作,如普通加锁、重复加锁不阻塞、带超时功能加锁及解锁等,并说明了不同操作的特点和注意事项。

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

锁的使用:
初始化与去初始化
#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);
itn pthread_mutex_destroy(pthread_mutex_t *mutex);

pthread_mutex_init使用指定的attr属性初始化一个互斥锁mutex,如果attr设为NULL或者使用一个默认的pthread_mutex attr_t类型都是使用默认属性进行初始化。
重复初始化一个已经初始化过的锁会导致未知行为
pthread_mutex_destroy可以销毁一个初始化过的锁。注:不要尝试销毁一个锁定状态的mutex
加锁与解锁

// 普通加锁,重复加锁会阻塞进程
int pthread_mutex_lock (pthread_mutex_t *__mutex);
// 重复加锁不阻塞进程
int pthread_mutex_trylock (pthread_mutex_t *__mutex);
// 带有超时功能加锁
int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abs_timeout);
// 解锁
int pthread_mutex_unlock (pthread_mutex_t *__mutex);

pthread_mutex_lock对一个 mutex 加锁。如果一个线程试图锁定一个已经被另一个线程锁定的互斥锁,那么该线程将被挂起,直到拥有该互斥锁的线程先解锁该互斥锁。
默认的 mutex 在同一个线程里再次被加锁会导致未定义行为,如果定义 mutex 为 PTHREAD_MUTEX_RECURSIVE 类型,即可递归 mutex ,则这个锁可以在同一个线程内重复加锁,每次加锁计数器+1,每次解锁计数器-1,当计数器为0 的时候其他线程才可以获取这个锁。

pthread_mutex_trylock 功能与pthread_mutex_lock,只是当mutex已经是锁定的时候,pthread_mutex_trylock直接返回错误码EBUSY,而不是阻塞进程。

pthread_mutex_timedlock也是加锁,但是只阻塞指定的时间,时间一到还没能获取锁则返回错误码ETIMEDOUT。

pthread_mutex_unlock为解锁。如果互斥锁未被锁定,尝试解锁会导致未定义行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值