在 pthread_mutex_destroy 的 Linux 手册页中,有以下代码片段。关于销毁互斥锁的过程,我不明白的一件事是,我们如何知道在 pthread_mutex_unlock 和 pthread_mutex_destroy 之间没有其他线程尝试获取所述互斥锁上的锁?
通常情况下,应该如何处理?1)是否应该使用额外的互斥锁来确保这种情况不会发生?2)或者客户有责任在引用计数达到0后不尝试增加引用计数?
obj_done(struct obj *op)
{
pthread_mutex_lock(&op->om);
if (--op->refcnt == 0) {
pthread_mutex_unlock(&op->om);
(A) pthread_mutex_destroy(&op->om);
(B) free(op);
} else
(C) pthread_mutex_unlock(&op->om);
}
Run Code Online (Sandbox Code Playgroud)
应该采取一些措施来确保互斥体在您\xe2\x80\x99 销毁它时不会再次尝试锁定,是的。在本例中,由于引用计数变为 0,因此可以合理地预期持有互斥体的线程也是最后一个拥有指向该对象的指针的线程。使用该对象的所有其他线程都已完成该对象,并减少了引用计数,并且忘记了该对象。pthread_mutex_destroy因此,执行时没有线程会尝试锁定互斥锁。
这就是典型的设计模式。在所有线程都使用完互斥锁之前,您不会销毁它。互斥锁的自然生命周期意味着您不必同步销毁它们。
\n