码迷,mamicode.com
首页 > 编程语言 > 详细

Linux 线程锁 pthread_mutex_t

时间:2017-09-21 23:21:29      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:lin   加锁线程   glib   多次   inux   dead   linux   释放   没有   

1)初始化线程锁

静态初始化:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

或者动态初始化:

int pthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutexattr_t* attr);

其中 attr 用于指定互斥锁属性,如果为NULL则使用缺省属性。 函数成功执行后,互斥锁被初始化为未锁住态。


2)锁的操作

2.1)加锁:

int pthread_mutex_lock(pthread_mutex_t*mutex);int pthread_mutex_trylock(pthread_mutex_t*mutex);

pthread_mutex_trylock() 方式在锁被占用的时候不会阻塞,而是返回EBUSY

2.2)释放锁:

int pthread_mutex_unlock(pthread_mutex_t*mutex);

2.3)销毁锁:

int pthread_mutex_destroy(pthread_mutex_t*mutex);

销毁一个互斥锁即意味着释放它所占用的资源,且要求锁当前处于开放状态。 由于在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的 pthread_mutex_destroy() 除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。


3)锁的属性

互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。

当前(glibc2.2.3,linuxthreads0.9)有四个值可供选择:

  • PTHREAD_MUTEX_TIMED_NP

这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。

  • PTHREAD_MUTEX_RECURSIVE_NP

嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。

  • PTHREAD_MUTEX_ERRORCHECK_NP

检错锁,如果同一个线程请求同一个锁,则返回 EDEADLK,否则与 PTHREAD_MUTEX_TIMED_NP 类型动作相同。 这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。

  • PTHREAD_MUTEX_ADAPTIVE_NP

适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。

Linux 线程锁 pthread_mutex_t

标签:lin   加锁线程   glib   多次   inux   dead   linux   释放   没有   

原文地址:http://www.cnblogs.com/fengbohello/p/7571722.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!