您的位置:首页 > 理论基础 > 计算机网络

linux下pthread_mutex_lock,pthread_mutex_unlock的使用http://blog.chinaunix.net/uid-28458801-id-4300492.ht

2015-07-27 14:53 561 查看
linux下pthread_mutex_lock,pthread_mutex_unlock的使用 2014-06-12
11:39:33

分类: LINUX

操作系统:Ubuntu10.04

前言

在家用设备上,可频繁上电,掉电。但是对于工业设备,经常都是连续工作很长时间的,因此从编程的角度而言,很多小概率发生的事情是要考虑的。如 pthread_mutex_lock, pthread_mutex_unlock 这些函数的返回异常。

很多时候,lock和unlock都是不做返回值判断的。

lock();

operation();

unlock();

如果不对lock()进行判断,即使在lock()返回错误(即没有成功获取到临界资源)的时候,也会继续执行 operation(),从而可能导致异常。

一,详解

函数名

pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock - lock and unlock a mutex

SYNOPSIS

概要
#include <pthread.h> int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t
*mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex);

描述
pthread_mutex_lock()函数锁住由mutex指定的mutex 对象。如果mutex已经被锁住,调用这个函数的线程阻塞直到mutex可用为止。这跟函数返回的时候参数mutex指定的mutex对象变成锁住状态,同时该函数的调用线程成为该mutex对象的拥有者。
如果mutex 对象的type是 PTHREAD_MUTEX_NORMAL,不进行deadlock detection(死锁检测)。企图进行relock 这个mutex会导致deadlock. 如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,结果是不未知的。
如果mutex类型是 PTHREAD_MUTEX_ERRORCHECK,那么将进行错误检查。如果一个线程企图对一个已经锁住的mutex进行relock,将返回一个错误。如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,将返回一个错误。
如果mutex类型是 PTHREAD_MUTEX_RECURSIVE,mutex会有一个锁住次数(lock count)的概念。当一个线程成功地第一次锁住一个mutex的时候,锁住次数(lock count)被设置为1,每一次一个线程unlock这个mutex的时候,锁住次数(lock
count)就减1。当锁住次数(lock count)减少为0的时候,其他线程就能获得该mutex锁了。如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,将返回一个错误。
如果mutex类型是 PTHREAD_MUTEX_DEFAULT,企图递归的获取这个mutex的锁的结果是不确定的。unlock一个不是被调用线程锁住的mutex的结果也是不确定的。企图unlock一个未被锁住的mutex导致不确定的结果。
pthread_mutex_trylock()调用在参数mutex指定的mutex对象当前被锁住的时候立即返回,除此之外,pthread_mutex_trylock()跟pthread_mutex_lock()功能完全一样。
The pthread_mutex_unlock()函数释放有参数mutex指定的mutex对象的锁。如果被释放取决于该Mutex对象的类型属性。如果有多个线程为了获得该mutex锁阻塞,调用pthread_mutex_unlock()将是该mutex可用,一定的调度策略将被用来决定哪个线程可以获得该mutex锁。(在mutex类型为PTHREAD_MUTEX_RECURSIVE 的情况下,只有当lock count 减为0并且调用线程在该mutex上已经没有锁的时候)(翻译到这里,才觉得我的这个锁概念是多么模糊)
如果一个线程在等待一个mutex锁得时候收到了一个signal,那么在从signal handler返回的时候,该线程继续等待该mutex锁,就像这个线程没有被中断一样。
返回值
成功,pthread_mutex_lock() 和 pthread_mutex_unlock() 返回0,否则返回一个错误的提示码
pthread_mutex_trylock() 在成功获得了一个mutex的锁后返回0,否则返回一个错误提示码

错误
pthread_mutex_lock() 和 pthread_mutex_unlock()失败的时候
[EINVAL]
mutex在生成的时候,它的protocol属性的值是 PTHREAD_PRIO_PROTECT,同时调用线程的优先级(priority)比该mutex的当前prority上限高
pthread_mutex_trylock() 函数在一下情况会失败:
[EBUSY] The mutex could not be acquired because it was already locked.
mutex已经被锁住的时候无法再获取锁
The pthread_mutex_lock(), pthread_mutex_trylock() and pthread_mutex_unlock() functions may fail if:

[EINVAL] mutex指向的mutex未被初始化[EAGAIN] Mutex的lock count(锁数量)已经超过 递归索的最大值,无法再获得该mutex锁
pthread_mutex_lock() 函数在一下情况下会失败:
[EDEADLK]当前线程已经获得该mutex锁
pthread_mutex_unlock() 函数在以下情况下会失败:
[EPERM]当前线程不是该mutex锁的拥有者所有的这些函数的错误返回值都不会是[EINTR]

二,参考

1,http://blog.163.com/ccbobo_cat/blog/static/32099462200902103637664/

2,http://www.th7.cn/system/lin/201401/49331.shtml
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: