Linux 线程锁 pthread_mutex_t

Posted fengbohello

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 线程锁 pthread_mutex_t相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

linux基础编程—互斥锁

线程同步

Linux下线程同步的几种方法

Linux 线程同步的三种方法

Linux C 多线程编程之互斥锁与条件变量实例详解

线程同步API