【问题标题】:Is it good practice to lock a pthread mutex before destroying it? [duplicate]在销毁 pthread 互斥体之前锁定它是一种好习惯吗? [复制]
【发布时间】:2014-11-07 19:27:54
【问题描述】:
class AAA
{
    ...
    ~AAA()
    {
        pthread_mutex_lock( &m_mutex );
        pthread_mutex_destroy( &m_mutex );
    }
}

问题> 我在项目的某个地方看到了这段代码。这样做是个好习惯吗? 或者在销毁互斥体之前锁定互斥体是未定义的行为?

【问题讨论】:

  • 如果你觉得有必要锁定它,它应该暗示另一个线程可以尝试请求它。当互斥锁被销毁时,该线程会发生什么?
  • @JanPetterJetmundsen,代码不是我写的,需要了解背后的原因。
  • 未定义。 @JanPetterJetmundsen 是对的。在销毁互斥体之前锁定它不是一个好习惯,即使在大多数实现中它没有做错任何事情。
  • @Gabriel 如果其他问题的答案似乎与下面提供的答案完全相反,那它怎么可能是重复的?
  • @JanPetterJetmundsen 这段代码让我觉得太荒谬了,我(希望)是有原因的。我想知道实际编写代码的人在想什么——这种明显的错误需要努力

标签: c++ pthreads


【解决方案1】:

我觉得这是一种非常糟糕的做法。

来自http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_destroy.html

销毁已解锁的已初始化互斥锁应该是安全的。尝试销毁锁定的互斥体会导致未定义的行为。

所以这段代码保证了未定义的行为并且需要修复。

【讨论】:

  • 为了完整起见,最新的手册页:pubs.opengroup.org/onlinepubs/9699919799/functions/…
  • 另请注意,根据该手册页,尝试 lock destroyed 互斥体也会导致未定义的行为。 (如果有任何理由锁定此互斥体,则意味着另一个线程也可能尝试锁定它。)
【解决方案2】:

这个link 表示其未定义的行为。

也许从您看到此代码的地方,原始编码人员想要破坏互斥锁,并且可能认为如果他/她能够锁定该互斥锁,那么这意味着它已被某个重要线程在其他地方解锁,因此他可以删除它。

但是执行不正确。

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 2023-03-17
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2015-10-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多