加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何检查pthread_mutex_t是否被锁定

发布时间:2020-12-16 09:41:43 所属栏目:百科 来源:网络整理
导读:我很确定这是一个天真的问题,但仍然会问它,因为我无法在网上找到太多帮助.我正在使用pthreads编写一个c代码.以下是其中一种方法的概述 void Method1(){ try { pthread_mutex_lock(syncLock); statement1; statement2; pthread_mutex_unlock(syncLock); state
我很确定这是一个天真的问题,但仍然会问它,因为我无法在网上找到太多帮助.我正在使用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块中写一个unlock语句,因为如果异常来自语句3那么互斥锁已被解锁并且在已经解锁的互斥锁上调用unlock会导致未定义的行为.

那么我有没有办法在catch语句中检查互斥锁是否已被解锁.或者,c中是否有可用的C#样式锁定语句替代,所以我确信即使从该块中抛出异常也会释放锁定

我不倾向于为此目的使用库.一个简单的自定义解决方案将非常感谢

谢谢

解决方法

写一个小型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(并且具有许多与其一起使用的互斥锁类型).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读