gpt4 book ai didi

c++ - 如何检查 pthread_mutex_t 是否被锁定

转载 作者:太空狗 更新时间:2023-10-29 20:15:10 27 4
gpt4 key购买 nike

我很确定这是一个天真的问题,但仍然会问这个问题,因为我在网上找不到太多帮助。我正在使用 pthreads 编写 C++ 代码。以下是其中一种方法的概述

void Method1()
{
try
{
pthread_mutex_lock(&syncLock);
statement1;
statement2;
pthread_mutex_unlock(&syncLock);
statement3;
statement4;
}
catch(exception& e)
{
log error
}
}

其中 syncLock 的类型为 pthread_mutex_t 并使用默认初始化进行初始化。

我的问题是,如果在方法的 statement2 中抛出异常,那么控制将直接传递到 catch 语句。在那种情况下,我的互斥锁保持锁定状态。但我也不能简单地在 catch block 中编写解锁语句,因为如果异常来自语句 3,则互斥量已解锁,并且在已解锁的互斥量上调用解锁会导致未定义的行为。

那么有没有一种方法可以在 catch 语句中检查互斥量是否已解锁。或者,在 C++ 中是否有 C# 样式的锁定语句替代方案,所以我确信即使从该 block 内抛出异常,锁也会被释放

我不倾向于为此目的使用库。一个简单的自定义解决方案将不胜感激

谢谢

最佳答案

编写一个小型 RAII 风格的储物柜类:

class lock { 
pthread_mutex_t &mutex;
public:
lock(pthread_mutex_t &m) :mutex(m) { pthread_mutex_lock(&mutex); }
~lock() { pthread_mutex_unlock(&mutex); }
};

然后像这样编写你的代码:

void Method1()
{
try
{
{
lock l(syncLock);
statement1;
statement2;
}
statement3;
statement4;
}
catch(exception& e)
{
log error
}
}

当您退出定义锁的范围时,锁将通过析构函数销毁,从而调用pthread_mutex_unlock。无论您是正常退出作用域还是通过异常退出,都会发生这种情况。当您进入异常处理程序时,您知道互斥体已被解锁。

请注意,C++11 已将其作为 std::lock_guard 内置到标准库中(并且有许多互斥锁类型可用于它)。

关于c++ - 如何检查 pthread_mutex_t 是否被锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14272969/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com