【问题标题】:How to assure that no other thread acquires a lock immediately before you destroy a mutex如何确保在销毁互斥锁​​之前没有其他线程立即获取锁
【发布时间】:2021-11-09 08:08:24
【问题描述】:

在 pthread_mutex_destroy 的 linux 手册页中,它有以下代码 sn-p 下面。 关于这个销毁互斥锁​​的过程,我不明白的一件事是,我们怎么知道在 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);
}

【问题讨论】:

  • 有趣的问题。这对我来说并不重要,因为我从来没有在我的生活中明确地销毁过互斥锁。不过,对于那些真正像互斥锁一样破坏同步的人来说,这是一个有趣的问题。

标签: c mutex locks


【解决方案1】:

应该做一些事情来确保互斥体在你销毁它时不会再次尝试锁定,是的。在示例情况下,由于涉及到引用计数为 0,因此可以合理地预期持有互斥锁的线程也是最后一个具有指向该对象的指针的线程。使用该对象的所有其他线程都完成了它,减少了引用计数,并且忘记了该对象。因此,当pthread_mutex_destroy 被执行时,没有线程会尝试锁定互斥锁。

这是典型的设计模式。在所有线程都完成之前,您不会破坏互斥锁。互斥体的自然生命周期意味着您不必同步销毁它们。

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 2018-10-19
    • 2019-11-01
    • 2015-05-03
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2013-08-28
    • 2012-12-25
    相关资源
    最近更新 更多