在销毁读/写锁时,Helgrind报告了以下错误:
pthread_rwlock_destroy一个锁定的互斥锁
暂且没有我正在销毁的锁,而不是互斥锁(虽然库的实现可能依赖于互斥锁),但错误可能是准确的,特别是因为随后释放锁的尝试被Helgrind标记为释放无效锁。
我理解破坏另一个线程仍然持有的锁可能是一个错误。 (锁通常与它们保护的资源一起销毁,如果持有锁,则意味着资源仍在使用中,不应销毁)。
现在我的问题:
销毁当前线程仍然持有的锁是错误的吗?
是的。 POSIX说:
如果在任何线程持有
pthread_rwlock_destroy()
时调用rwlock
,则结果是不确定的。
这很清楚 - “任何线程”包括当前线程。
推理将沿着这些方向:另一个线程可以竞争用当前线程的pthread_rwlock_destroy()
获取锁定,或者它不能。如果可以,那么程序已经是错误的,因为尝试锁定未初始化的锁是未定义的;如果它不能,那么当前线程首先解锁锁定然后销毁它就足够了。
如果是这样,当我要销毁两者时,如何防止其他线程获取锁并搞乱资源?
上面的推理暗示了这个问题的答案 - 要破坏对象,包括其中的锁,你必须首先使其无法访问任何其他线程。您可以通过从其他数据结构中删除对它的所有引用来完成此操作,这可能涉及获取和释放其他锁,但是一旦您将对象本身隔离,您就可以安全地解锁它,因为您的线程必须保留唯一的剩余引用。