Fua*_*uad 1 c multithreading mutex locking pthreads
因此,假设1个线程,线程通过以下方式获取锁定:
pthread_mutex_lock(&lock);
Run Code Online (Sandbox Code Playgroud)
然后在解锁之前,它再次到达一条线:
pthread_mutex_lock(&lock);
Run Code Online (Sandbox Code Playgroud)
pthread库是否会阻止线程的进展,还是会识别出线程已经持有锁,从而让它通过?
行为取决于互斥锁的类型.该POSIX标准说,递归锁定行为取决于锁的类型
如果某个线程尝试重新锁定它已锁定的互斥锁,则其
pthread_mutex_lock()行为应如下表的Relock列中所述.
随着Relock专栏的说法
PTHREAD_MUTEX_NORMAL应该死锁PTHREAD_MUTEX_ERRORCHECK应返回错误PTHREAD_MUTEX_RECURSIVE将作为递归锁定,然后您必须解锁锁定它的次数PTHREAD_MUTEX_DEFAULT将具有未定义的行为,这实际上意味着如果在该平台上默认锁定是前3种类型中的任何一种,它将在上面的列中表现出特征性,如果它是其他类型,那么行为将不确定.因此,有尤其是在没有点测试一个PTHREAD_MUTEX_DEFAULT锁,以找出行为是什么.
而Linux指南手册pthread_mutex_lock(3) rephrases有以下几点:
如果互斥锁已被调用线程锁定,则pthread_mutex_lock的行为取决于互斥锁的类型.如果互斥锁是 快速 类型,则调用线程将被挂起,直到互斥锁被解锁,从而有效地导致调用线程死锁.如果互斥锁是错误检查类型,则pthread_mutex_lock会立即返回错误代码
EDEADLK.如果互斥锁是递归 类,则pthread_mutex_lock成功并立即返回,记录调用线程锁定互斥锁的次数.pthread_mutex_unlock在互斥锁返回解锁状态之前,必须执行相同数量的操作.
在Linux中根据文档,默认类型很快,但你不能依赖它是可移植的.