pthread_rwlock_destroy一个锁定的互斥锁

问题描述 投票:1回答:1

在销毁读/写锁时,Helgrind报告了以下错误:

pthread_rwlock_destroy一个锁定的互斥锁

暂且没有我正在销毁的锁,而不是互斥锁(虽然库的实现可能依赖于互斥锁),但错误可能是准确的,特别是因为随后释放锁的尝试被Helgrind标记为释放无效锁。

我理解破坏另一个线程仍然持有的锁可能是一个错误。 (锁通常与它们保护的资源一起销毁,如果持有锁,则意味着资源仍在使用中,不应销毁)。

现在我的问题:

  • 销毁当前线程仍然持有的锁是错误的吗?
  • 如果是这样,背后的原因是什么?
  • 如果是这样,当我要销毁两者时,如何防止其他线程获取锁并搞乱资源?
multithreading pthreads valgrind
1个回答
3
投票

销毁当前线程仍然持有的锁是错误的吗?

是的。 POSIX说:

如果在任何线程持有pthread_rwlock_destroy()时调用rwlock,则结果是不确定的。

这很清楚 - “任何线程”包括当前线程。

推理将沿着这些方向:另一个线程可以竞争用当前线程的pthread_rwlock_destroy()获取锁定,或者它不能。如果可以,那么程序已经是错误的,因为尝试锁定未初始化的锁是未定义的;如果它不能,那么当前线程首先解锁锁定然后销毁它就足够了。

如果是这样,当我要销毁两者时,如何防止其他线程获取锁并搞乱资源?

上面的推理暗示了这个问题的答案 - 要破坏对象,包括其中的锁,你必须首先使其无法访问任何其他线程。您可以通过从其他数据结构中删除对它的所有引用来完成此操作,这可能涉及获取和释放其他锁,但是一旦您将对象本身隔离,您就可以安全地解锁它,因为您的线程必须保留唯一的剩余引用。

© www.soinside.com 2019 - 2024. All rights reserved.