如何确保在销毁互斥锁之前没有其他线程立即获取锁
How to assure that no other thread acquires a lock immediately before you destroy a mutex
在 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);
}
应该做一些事情 以确保互斥量在您销毁它时不会再尝试锁定,是的。在示例情况下,引用计数变为 0,可以合理地预期持有互斥锁的线程也是最后一个具有指向对象指针的线程。使用该对象的所有其他线程都已完成使用它,减少了引用计数,并忘记了该对象。因此,当执行 pthread_mutex_destroy
时,没有线程会尝试锁定互斥量。
这是典型的设计模式。在所有线程都用完它之前,您不会销毁互斥锁。互斥量的自然生命周期意味着您不必同步销毁它们。
在 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);
}
应该做一些事情 以确保互斥量在您销毁它时不会再尝试锁定,是的。在示例情况下,引用计数变为 0,可以合理地预期持有互斥锁的线程也是最后一个具有指向对象指针的线程。使用该对象的所有其他线程都已完成使用它,减少了引用计数,并忘记了该对象。因此,当执行 pthread_mutex_destroy
时,没有线程会尝试锁定互斥量。
这是典型的设计模式。在所有线程都用完它之前,您不会销毁互斥锁。互斥量的自然生命周期意味着您不必同步销毁它们。