假设有两个线程,主线程和B线程(由主线程创建)。如果B线程获取了一个互斥锁(如pthread_mutex)并在未解锁该锁的情况下调用了pthread_exit。那么这个互斥锁会发生什么?它会变得可用吗?
假设B线程已经获得了锁并没有对锁进行解锁,当它调用pthread_exit时,锁将保持被锁定状态。其他任何尝试获得相同锁的线程都将被阻塞,直到该锁被释放为止。因此,在这种情况下,互斥锁不会变得可用,而是保持被锁定状态,直到被当前占用锁的线程解锁。假设有两个线程,主线程和B线程(由主线程创建)。如果B线程获取了一个互斥锁(如pthread_mutex)并在未解锁该锁的情况下调用了pthread_exit。那么这个互斥锁会发生什么?它会变得可用吗?
假设B线程已经获得了锁并没有对锁进行解锁,当它调用pthread_exit时,锁将保持被锁定状态。其他任何尝试获得相同锁的线程都将被阻塞,直到该锁被释放为止。因此,在这种情况下,互斥锁不会变得可用,而是保持被锁定状态,直到被当前占用锁的线程解锁。pthread_mutex_init
之前设置了正确的属性来创建一个健壮的互斥锁,当持有锁的线程终止时,互斥锁将进入特殊状态,下一个尝试获取互斥锁的线程将会得到EOWNERDEAD
的错误。此时,它需要清理互斥锁保护的任何状态并调用pthread_mutex_consistent
使互斥锁再次可用,或者调用pthread_mutex_unlock
(这将使互斥锁永久不可用;进一步尝试使用它将返回ENOTRECOVERABLE
)。PTHREAD_MUTEX_ERRORCHECK
属性创建的,在这种情况下将返回一个错误。
pthread_mutexattr_settype(PTHREAD_MUTEX_RECURSIVE)
。 - SingleNegationElimination