创建与销毁
- 静态初始化
复制代码
1pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
- 动态初始化
复制代码
1int pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * attr)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15struct 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则使用默认属性
- 动态销毁
复制代码
在Linux中,互斥锁不占用任何资源,因此该函数只检查锁状态,若为锁定则返回EBUSY。
1int pthread_mutex_destroy (pthread_mutex_t * mutex)
对pthread_mutexattr_t的维护
复制代码
1
2
3
4
5
6int 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 -
复制代码
1
2
3int 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互斥锁内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复