首页 > 其他 > 详细

posix thread互斥量

时间:2015-12-17 22:25:52      阅读:201      评论:0      收藏:0      [点我收藏+]

互斥量

互斥量(Mutex)是“mutual exclusion”的缩写。互斥量是实现线程同步,和保护同时写共享数据的主要方法。
使用互斥量的典型顺序如下:
1. 创建和初始一个互斥量
2. 多个线程尝试去锁定该互斥量
3. 仅有一个线程可以成功锁定改互斥量
4. 锁定成功的线程做一些处理
5. 线程解锁该互斥量
6. 另外一个线程获得互斥量,重复上述过程
7. 最后销毁互斥量

 

创建和销毁互斥量

pthread_mutex_t_numtex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr);
int pthread_mutex_destory(pthread_mutex_t *mutex);

 

互斥量必须用类型pthread_mutex_t类型声明,在使用前必须初始化,这里有两种方法可以初始化互斥量:

  1. 声明时静态地,如:pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER; 
  2. 动态地用pthread_mutex_init()函数,这种方法允许设定互斥量的属性对象attr。

互斥量初始化后是解锁的。 

attr对象用于设置互斥量对象的属性,使用时必须声明为pthread_mutextattr_t类型,默认值可以是NULL。

Pthreads标准定义了三种可选的互斥量属性: 

  1. 协议(Protocol): 指定了协议用于阻止互斥量的优先级改变 
  2. 优先级上限(Prioceiling):指定互斥量的优先级上限 
  3. 进程共享(Process-shared):指定进程共享互斥量

注意所有实现都提供了这三个可先的互斥量属性。

pthread_mutexattr_init()和pthread_mutexattr_destroy()函数分别用于创建和销毁互斥量属性对象。

pthread_mutex_destroy()应该用于释放不需要再使用的互斥量对象。

 

将互斥量和它要保护的数据明显的关联起来是个不错的选择。如下例: 

 技术分享mutex_dynamic.c

 

加锁和解锁互斥量

int pthread_mutex_lock(pthread_mutex_t *mutex);
int phtread_mutex_trylock(pthread_mutex_t *mutex); //非阻塞加锁
int pthrad_mutex_unlock(pthread_mutex_t *mutex);

线程用pthread_mutex_lock()函数去锁定指定的mutex变量,若该mutex已经被另外一个线程锁定了,该调用将会阻塞线程直到mutex被解锁。

pthread_mutex_trylock()尝试着去锁定一个互斥量,然而,若互斥量已被锁定,程序会立刻返回并返回一个忙错误(EBUSY)值。该函数在优先级改变情况下阻止死锁是非常有用的。

线程可以用pthread_mutex_unlock()解锁自己占用的互斥量。在一个线程完成对保护数据的使用,而其它线程要获得互斥量在保护数据上工作时,可以调用该函数。

若有一下情形则会发生错误:

  1. 互斥量已经被解锁
  2. 互斥量被另一个线程占用

 技术分享alarm_mutex.c

 

 在试锁和回退算法中,总是应该以相反的顺序解锁互斥量:

  • 尝试加锁互斥量1;如果成功,再加锁互斥量2;如果成功,再加锁互斥量3。如果某一个互斥量加锁失败,则全部回退。
  • 解锁互斥量3/2/1

按照相反顺序解锁,如果第二个线程需要加锁这三个互斥量,则会由于加锁互斥量1失败而回退;而如果先解锁1-2-3这样的顺序,可能会到加锁互斥量3时候才失败,回退代价更大。

  

 

posix thread互斥量

原文:http://www.cnblogs.com/licongyu/p/5045788.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!