C++ boost共享互斥体检查是否锁定在同一线程中

C++ boost共享互斥体检查是否锁定在同一线程中,c++,multithreading,boost,boost-mutex,C++,Multithreading,Boost,Boost Mutex,当我编写多线程算法时,我发现一些方法非常有用,可以对互斥体的状态进行预测。对于一些人来说,它已经被锁定,对于一些人来说,它没有被锁定 我提出了如何断言互斥锁是否已经被锁定的方法: ASSERT(!mutex.try_lock_shared()); // assert if the mutex is not uniquely locked ASSERT(!mutex.try_lock()); // assert if the mutex is not at least shared locked

当我编写多线程算法时,我发现一些方法非常有用,可以对互斥体的状态进行预测。对于一些人来说,它已经被锁定,对于一些人来说,它没有被锁定

我提出了如何断言互斥锁是否已经被锁定的方法:

ASSERT(!mutex.try_lock_shared()); // assert if the mutex is not uniquely locked

ASSERT(!mutex.try_lock()); // assert if the mutex is not at least shared locked
问题是我如何能够断言检查互斥锁是否未锁定。。。从当前线程。例如,如果我这样做

     if (mutex.try_lock()) {
        mutex.unlock();
     } else {
        ASSERT(false); // the mutex is locked
     }

很明显,它有时会失败,只是因为其他线程锁定了它。

boost有递归和非递归互斥。如果函数是可重入的,则使用递归互斥。那么您就不必担心当前线程是否已经锁定了它。

我不想重新进入互斥锁。锁定互斥锁将指示错误。我希望尽快收到信号,表明我在逻辑上有错误。尝试使用带标志的递归互斥。递归互斥将允许您在同一线程上多次锁定。该标志将表示以前是否已锁定。类似于:boost::recursive\u mutex::scoped\u lock lmtx;如果标志{//handle error}标志{=true。。。我正在编写非常复杂的多线程算法,其中有许多方法相互调用。-我在这里能给出的最好的建议是:简化。只需将其分解为更高级别的步骤,这样您就可以确定谁负责锁定。递归互斥体几乎总是一种代码味道。就像共享指针一样,它们被过度使用,而不是让设计变得简单。非常复杂的是我在完成所有这些之后所达到的状态。当我明确要求共享互斥时,我不确定为什么每个人都认为我要问的是与可重入互斥有多大关系。我想要的是,就像每一个优秀的开发人员一样,当我指定一个方法期望值时,而不是注释时,我希望能够添加一个断言,如果有什么东西破坏了协议,它可以更快地说明问题。我明白了。只是当你无法解释——以什么方式——你的特定应用程序是复杂的,这让我觉得可能有点设计欠债。否则,我看不出在问题中提到这种假定的复杂性有什么建设性/相关性。如果你不希望这与此有任何关系,你可以将其从问题中删除。不确定为什么你会发现这样做有害,但我会将其删除,因为你是对的,它也没有任何作用。只需编写你自己的互斥体,使其具有你想要的行为。您可以使用常规互斥来实现它们,以保护它们的内部状态。例如,lock函数可以首先锁定一个常规互斥锁,然后将持有该锁变量的用户设置为当前线程的标识符。这使得断言有效。