该pthread_mutex_unlock()
函数应释放互斥锁引用的互斥锁对象。但是,释放互斥锁的方式取决于互斥锁的类型属性。如果在调用mutex 时,mutex 引用的mutex 对象上有线程阻塞pthread_mutex_unlock()
,导致mutex 可用,调度策略将决定哪个线程获取mutex。
如果互斥锁类型为PTHREAD_MUTEX_NORMAL
,则不应提供死锁检测。尝试重新锁定互斥锁会导致死锁。如果线程尝试解锁它尚未锁定的互斥锁或解锁的互斥锁,则会导致未定义的行为。
如果互斥体类型是PTHREAD_MUTEX_ERRORCHECK
,则应提供错误检查。如果线程试图重新锁定它已经锁定的互斥锁,则应返回错误。如果一个线程试图解锁一个它尚未锁定的互斥锁或一个已解锁的互斥锁,将返回一个错误。
如果互斥锁类型为PTHREAD_MUTEX_RECURSIVE
,则互斥锁应维护锁计数的概念。当线程第一次成功获取互斥锁时,锁计数应设置为 1。每次线程重新锁定此互斥体时,锁定计数应加一。每次线程解锁互斥锁时,锁计数应减一。当锁计数达到零时,互斥锁将可供其他线程获取。如果一个线程试图解锁一个它尚未锁定的互斥锁或一个已解锁的互斥锁,将返回一个错误。
如果互斥锁类型是PTHREAD_MUTEX_DEFAULT
,尝试递归锁定互斥锁会导致未定义的行为。如果调用线程未锁定互斥锁,则尝试解锁互斥锁会导致未定义的行为。如果互斥锁未锁定,则尝试解锁它会导致未定义的行为。
我通常更喜欢使用PTHREAD_MUTEX_RECURSIVE
互斥锁,因为在这种情况下,当计数达到零并且调用线程不再对该互斥锁拥有任何锁时,互斥锁将变得可用。