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(并且具有许多与其一起使用的互斥锁类型). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |