gpt4 book ai didi

c - 如何确保在销毁互斥体之前没有其他线程立即获取锁

转载 作者:行者123 更新时间:2023-12-02 01:53:29 26 4
gpt4 key购买 nike

在 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时,没有线程会尝试锁定互斥锁。

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

关于c - 如何确保在销毁互斥体之前没有其他线程立即获取锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69894708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com