锁定互斥锁的pthread_rwlock_destroy

时间:2019-04-10 13:56:43

标签: multithreading pthreads valgrind

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

  

互斥锁的pthread_rwlock_destroy

撇开它是我要销毁的锁而不是互斥锁的事实(尽管库的实现可能依赖互斥锁),该错误可能是准确的,尤其是因为随后的尝试将释放该锁由Helgrind标记为释放无效的锁。

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

现在我的问题:

  • 破坏当前线程仍在持有的锁是错误的吗?
  • 如果是这样,其背后的原因是什么?
  • 如果是这样,当我要销毁这两个线程时,如何防止其他线程获取锁并弄乱资源?

1 个答案:

答案 0 :(得分:3)

  

销毁仍由其持有的锁是错误的   当前线程?

是的。 POSIX说:

  

如果在任何情况下调用pthread_rwlock_destroy(),则结果不确定   线程持有rwlock

这很明显-“任何线程”都包括当前线程。

推理将遵循以下思路:另一个线程可能正在争相使用当前线程的pthread_rwlock_destroy()来获得锁,或者不能。如果可以,则该程序已经错误,因为尝试锁定未初始化的锁是未定义的;如果不能,则当前线程足以先解锁该锁,然后销毁它。

  

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

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