在销毁读/写锁时,Helgrind报告了以下错误:
互斥锁的pthread_rwlock_destroy
撇开它是我要销毁的锁而不是互斥锁的事实(尽管库的实现可能依赖互斥锁),该错误可能是准确的,尤其是因为随后的尝试将释放该锁由Helgrind标记为释放无效的锁。
我知道破坏一个仍然由另一个线程持有的锁可能是一个错误。 (锁通常会与它们所保护的资源一起销毁,如果持有该锁,则意味着该资源仍在使用中,不应销毁。)
现在我的问题:
答案 0 :(得分:3)
销毁仍由其持有的锁是错误的 当前线程?
是的。 POSIX说:
如果在任何情况下调用
pthread_rwlock_destroy()
,则结果不确定 线程持有rwlock
。
这很明显-“任何线程”都包括当前线程。
推理将遵循以下思路:另一个线程可能正在争相使用当前线程的pthread_rwlock_destroy()
来获得锁,或者不能。如果可以,则该程序已经错误,因为尝试锁定未初始化的锁是未定义的;如果不能,则当前线程足以先解锁该锁,然后销毁它。
如果是这样,如何防止其他线程获取锁并 当我要销毁这两个资源时会弄乱资源吗?
以上推理暗示了答案-要破坏对象(包括其中的锁),必须先 使其他线程无法访问它。您可以通过从其他数据结构中删除对它的所有引用来完成此操作,这可能涉及获取和释放其他锁,但是一旦对象本身被隔离,您就可以安全地对其进行解锁,因为线程必须随后保留唯一的剩余引用。 / p>