POSIX互斥锁[转]

http://blog.csdn.net/ba_jie/article/details/6737057

 

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

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

 

对pthread_mutexattr_t的维护

  1. int pthread_mutexattr_init (pthread_mutexattr_t * attr); 
  2. int pthread_mutexattr_destroy (pthread_mutexattr_t * attr); 
  3. int pthread_mutexattr_getpshared (const pthread_mutexattr_t * attr, int * pshared); 
  4. int pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, int pshared); 
  5. int pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind); 
  6. int pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int * kind); 
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    -
  1. int pthread_mutex_lock (pthread_mutex_t * mutex); 
  2. int pthread_mutex_unlock (pthread_mutex_t * mutex); 
  3. int pthread_mutex_trylock (pthread_mutex_t * mutex);//在锁已经被占据时返回EBUSY而不是挂起等待 
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实现都不是取消点,因此,延迟取消类型的线程不会因收到取消信号而离开加锁等待。
  • 线程在加锁后解锁前被取消,锁将永远保持锁定状态。因此如果在关键区段内有取消点存在,或者设置了异步取消类型,则必须在退出回调函数中解锁。
  • 锁机制不是异步信号安全的,也就是说,不应该在信号处理过程中使用互斥锁,否则容易造成死锁。
posted @ 2013-08-20 13:41  kuangniuniu  阅读(297)  评论(0编辑  收藏  举报