概述
创建与销毁
- 静态初始化
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);
锁操作
- 不论哪种类型的锁,都不可能被两个不同的线程同时得到,而必须等待解锁。
- 关于解锁者:
- 对于普通锁和适应锁类型,解锁者可以是同进程内任何线程
- 对于嵌套锁,文档和实现要求必须由加锁者解锁,但实验结果表明并没有这种限制
- 检错锁必须由加锁者解锁才有效,否则返回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实现都不是取消点,因此,延迟取消类型的线程不会因收到取消信号而离开加锁等待。
- 线程在加锁后解锁前被取消,锁将永远保持锁定状态。因此如果在关键区段内有取消点存在,或者设置了异步取消类型,则必须在退出回调函数中解锁。
- 锁机制不是异步信号安全的,也就是说,不应该在信号处理过程中使用互斥锁,否则容易造成死锁。
最后
以上就是俭朴大雁为你收集整理的POSIX互斥锁的全部内容,希望文章能够帮你解决POSIX互斥锁所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复