【问题标题】:How to check whether a mutex lock have been destroyed or not?如何检查互斥锁是否已被破坏?
【发布时间】:2022-11-11 01:25:04
【问题描述】:

我的代码尝试调用pthread_mutex_destory() 两次时遇到问题。我需要检查锁之前是否被破坏过。

我怎样才能做到这一点?这会起作用吗:

void deinit()
{
    if(1 == pthread_mutex_trylock(&this->m_lock))
    {
        (void) pthread_mutex_destroy(&this->m_lock);
    }
}

trylock 是否只会检查互斥锁是否被锁定的天气,或者它还会显示它是否被删除的天气?

【问题讨论】:

    标签: c++ multithreading pthreads


    【解决方案1】:

    一旦你销毁了一个 c 对象,留下的数据就是垃圾。 c++ 不允许你这样做。 (确实如此,但您必须明确要求。)但是您使用的是 c 库,因此您必须自己做所有事情。

    所以你有几个选择:

    • 使用与 c++ 很好地配合使用的 std::mutex 。但因此,您的互斥锁将与您的包含类具有相同的生命周期。 (这是整洁的)

    • 只在你的析构函数中使用pthread_mutex_destroy。结果与上面相同。当你的对象被破坏时,你的互斥锁被破坏了,这只会发生一次。

    • 如果未初始化,则使用std::optional 屏蔽互斥数据。 不推荐,因为它是 c 和 c++ 的丑陋组合。

    • 使用 bool 来跟踪是否已启动互斥锁。 这也很棘手和丑陋,因为它容易出错。

    我不能更具体,因为我不知道其余的代码。

    【讨论】:

    • 我将使用std::mutex 这是合乎逻辑的做法。但是现在我有一个遗留代码,我想在转换为标准库之前同步所有内容。我考虑在我的析构函数中使用它,但由于某些其他原因,我不能使用我的构造函数,我担心在我的 init 函数(可以多次调用)上创建对象并在我的析构函数中删除它会导致一些奇怪行为。我想我得到了答案。谢谢!
    【解决方案2】:

    我需要检查锁之前是否被破坏过。

    我怎样才能做到这一点?

    不能肯定地去做。也就是说,没有办法检查pthread_mutex_t 对象以确定它是否已初始化。 pthread_mutex_init() 对这个目的没有用,除pthread_mutex_init() 之外的互斥锁函数只有在互斥锁被初始化时才定义行为。

    trylock 是否只会检查互斥锁是否被锁定的天气,或者它还会显示它是否被删除的天气?

    当提供的指针未指向有效的、已初始化的互斥对象时,pthread_mutex_trylock() 的行为未定义。因此,不,您不能依靠它来检测互斥锁是否已被破坏。

    更一般地说,没有安全的方法来销毁可能仍然存在争用的互斥锁。在销毁互斥锁​​之前,您需要通过某种方式(通常是程序的结构)确保在互斥锁销毁期间或之后,任何线程都不可能尝试访问互斥锁。您不能为此依赖互斥锁本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2013-12-01
      • 1970-01-01
      • 2015-09-12
      • 2021-11-07
      • 1970-01-01
      相关资源
      最近更新 更多