如何检查互斥锁是否被销毁?



我有一个问题,我的代码试图调用pthread_mutex_destory()两次。我需要检查一下锁以前是否被破坏过。

我该怎么做?这行吗?

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

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

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

所以你有几个选项:

  • 使用std::互斥锁,这在c++中工作得很好。但就其本身而言,互斥锁的生命周期将与包含互斥锁的类相同。

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

  • 使用std::optional来保护互斥数据,如果互斥数据没有初始化。不推荐,因为它是c和c++的丑陋混合。

  • 使用bool来跟踪互斥是否被启动。这也很棘手,很难看,因为它容易出错。

我不能更具体,因为我不知道剩下的代码。

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

我该怎么做?

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

可以维护一个单独的原子标志来指示互斥锁是否被初始化,但通常最好的方法是构造程序,使多个线程不可能试图销毁同一个互斥锁。有时可行的一种方法就是完全避免显式地破坏它们。

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

当提供的指针没有指向一个有效的、初始化的互斥对象时,pthread_mutex_trylock()的行为是未定义的。因此,不能依赖它来检测互斥锁是否被销毁。

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

最新更新