POSIX互斥锁

创建与销毁

  • 静态初始化   
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  • 动态初始化
int pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * attr)
struct pthread_mutexattr_t
{
	enum lock_type    // 使用pthread_mutexattr_settype来更改
	{
		PTHREAD_MUTEX_TIMED_NP [default]//当一个线程加锁后,其余请求锁的线程形成等待队列,在解锁后按优先级获得锁。
		PTHREAD_MUTEX_ADAPTIVE_NP		// 动作最简单的锁类型,解锁后所有线程重新竞争。
		PTHREAD_MUTEX_RECURSIVE_NP		// 允许同一线程对同一锁成功获得多次。当然也要解锁多次。其余线程在解锁时重新竞争。
		PTHREAD_MUTEX_ERRORCHECK_NP		// 若同一线程请求同一锁,返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP动作相同。
	} type;
} attr;		// 若NULL则使用默认属性
  • 动态销毁

int pthread_mutex_destroy (pthread_mutex_t * mutex)
在Linux中,互斥锁不占用任何资源,因此该函数只检查锁状态,若为锁定则返回EBUSY。


对pthread_mutexattr_t的维护

int pthread_mutexattr_init (pthread_mutexattr_t * attr);
int pthread_mutexattr_destroy (pthread_mutexattr_t * attr);
int pthread_mutexattr_getpshared (const pthread_mutexattr_t * attr, int * pshared);
int pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, int pshared);
int pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind);
int pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int * kind);

锁操作

  • 不论哪种类型的锁,都不可能被两个不同的线程同时得到,而必须等待解锁。
  • 关于解锁者:
  1. 对于普通锁和适应锁类型,解锁者可以是同进程内任何线程
  2. 对于嵌套锁,文档和实现要求必须由加锁者解锁,但实验结果表明并没有这种限制
  3. 检错锁必须由加锁者解锁才有效,否则返回EPERM    -
int pthread_mutex_lock (pthread_mutex_t * mutex);
int pthread_mutex_unlock (pthread_mutex_t * mutex);
int pthread_mutex_trylock (pthread_mutex_t * mutex);//在锁已经被占据时返回EBUSY而不是挂起等待

其它

  • POSIX线程锁机制的Linux实现都不是取消点,因此,延迟取消类型的线程不会因收到取消信号而离开加锁等待。
  • 线程在加锁后解锁前被取消,锁将永远保持锁定状态。因此如果在关键区段内有取消点存在,或者设置了异步取消类型,则必须在退出回调函数中解锁。
  • 锁机制不是异步信号安全的,也就是说,不应该在信号处理过程中使用互斥锁,否则容易造成死锁。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值