Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查pthread_mutex_t是否已锁定_C++_Pthreads - Fatal编程技术网

C++ 如何检查pthread_mutex_t是否已锁定

C++ 如何检查pthread_mutex_t是否已锁定,c++,pthreads,C++,Pthreads,我很确定这是一个幼稚的问题,但我还是要问,因为我在网上找不到太多的帮助。我用p螺纹编写C++代码。以下是其中一种方法的概述 void Method1() { try { pthread_mutex_lock(&syncLock); statement1; statement2; pthread_mutex_unlock(&syncLock); statement3; statement4; } cat

我很确定这是一个幼稚的问题,但我还是要问,因为我在网上找不到太多的帮助。我用p螺纹编写C++代码。以下是其中一种方法的概述

void Method1()
{
    try
    {
    pthread_mutex_lock(&syncLock);
    statement1;
    statement2;
    pthread_mutex_unlock(&syncLock);
    statement3;
    statement4;
    }
    catch(exception& e)
    {
    log error
    }
}
其中,syncLock的类型为
pthread\u mutex\t
,并使用默认初始化进行初始化

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

因此,有没有一种方法可以检查catch语句中的互斥锁是否已解锁。或者,C++中是否有一个C?ySype锁语句替代方案,因此,即使从该块

中抛出异常,也可以确保释放该锁。 我不愿意为此目的使用图书馆。一个简单的定制解决方案将不胜感激


谢谢

写一个小小的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\u mutex\u unlock
。无论您是正常退出范围还是通过异常退出范围,都会发生这种情况。当您进入异常处理程序时,您知道互斥锁已解锁

请注意,C++11在标准库中内置了它,作为标准库
std::lock\u guard
(并且有许多互斥类型可与之一起使用)。

使用 pthread\u mutex\u trylock 如果互斥锁已锁定,它将提供忙碌状态。如果它没有锁定,那么它将锁定它。 在此之后解锁互斥锁。
pthread_mutex_unlock(pthread_mutex_t*mutex)

这是正确的,但不是一个好主意。(或者可能是问错了。)@JerryCoffin的答案是正确的。是的,这是一个错误的问题。此人在正文中提出的问题与标题中的问题截然不同;就问题的标题而言,这个答案是正确的。