当前位置: 首页 > 面试题库 >

如何断言std :: mutex是否已锁定?

傅振濂
2023-03-14
问题内容

使用GCC 4.8.2(在Linux / Debian / Sid 64位上)或GCC 4.9(在C ++ 11中可用)-我有一些互斥锁

std::mutex gmtx;

实际上,它是static某个类的成员,Foo同时包含下面的alphabeta方法。

它被锁定alpha

void alpha(void) {
   std::lock_guard<std::mutex> g(gmtx);
   beta(void);
   // some other work
}

我想检查beta一下确实gmtx被锁定了:

void beta(void) {
   assert (gmtx.is_locked());
   // some real work
}

is_locked仅在内部调用的通知assert。。。效率可能非常低下,有时甚至不准确)

当然,我还有其他函数调用beta,例如

void gamma(void) {
   std::lock_guard<std::mutex> g(gmtx);
   beta();
   // some other work
}

is_locked不存在。…我应该如何定义它?(实际上,我想确保互斥体已被某些[间接]调用者锁定在同一线程中。)

(我要测试的原因assertbeta可以在其他地方调用)

我不能使用try_lock(除非使用递归互斥锁),因为在通常情况下,它将锁定一个已经锁定的互斥锁…(由调用方锁定在同一线程中),这不仅是未定义的行为,而且是完全阻塞的。

除非确实需要,否则我想避免使用递归互斥锁(比普通互斥锁更昂贵)。

注意:真正的程序要复杂一些。实际上,所有方法都在一个类中,该类维护“项目”上的命名双向关系。所以我在该类中有一个从项目到名称的映射,另一个是从名称到项目的映射。beta将内部方法添加一个真正的命名,并alphagamma会发现它的名称,或通过其项目的名称-
或加入-一个项目的方法

PS:真正的程序尚未发布,但应该成为MELT的一部分-
将来的监视器;您可以从此处(一个临时位置)下载它(Alpha舞台,非常容易出错)


问题答案:

std::unique_lock<L>具有owns_lock成员函数(相当于is_locked您所说的)。

std::mutex gmtx;
std::unique_lock<std::mutex> glock(gmtx, std::defer_lock);

void alpha(void) {
   std::lock_guard<decltype(glock)> g(glock);
   beta(void);
   // some other work
}
void beta(void) {
   assert(glock.owns_lock()); // or just assert(glock);
   // some real work
}

编辑: 在此解决方案中,所有锁定操作应通过unique_lock
glock而不是“原始”互斥锁执行gmtx。例如,alphalock_guard<unique_lock<mutex>>(或简单地lock_guard<decltype(glock)>)重写成员函数。



 类似资料:
  • 我在理解条件变量及其在互斥体中的使用时遇到了一些困难,我希望社区能帮助我。请注意,我来自win32背景,因此与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。 这是我第一次尝试使用C++11标准库进行并发操作,它是在这里找到的一个程序示例的修改版本。 关于这个的几个问题。 我读过“任何要等待std::condition_var

  • 问题内容: Java中是否有Mutex对象或一种创建对象的方法?我问是因为用1许可初始化的Semaphore对象对我没有帮助。考虑这种情况: 如果在第一次获取时发生异常,则catch块中的释放将增加许可,并且该信号量不再是二进制信号量。 正确的方法是吗? 上面的代码是否可以确保信号量是二进制的? 问题答案: 看到此页面:http : //www.oracle.com/technetwork/art

  • 使用Hamcrest可以很容易地否定匹配器。例如。您可以这样编写断言:

  • 问题内容: 我有一台故意安装了JDK的计算机。我有一台装有JRE的计算机,用于进行测试。但是,当我在这台计算机上运行一个Java应用程序,然后在另一台计算机上对其进行尝试时,它抱怨说需要JDK。如何检查系统是否以某种方式安装了JDK?注意:相关计算机为Mac。 问题答案: 您可以打开终端,只需键入 这应该向您显示系统上安装的Java的版本(假设您已在系统环境中设置了Java的路径)。 如果还没有,

  • 问题内容: 我下载了封装在zip文件中的proguard,并将其解压缩到硬盘上。我没有以任何方式 安装 它(因为我不知道如何安装)。然后,我将其添加到我的project.properties文件中。然后,我做了一个“导出android应用程序”,完全希望eclipse抱怨它不知道我的proguard安装在哪里,但是没有抱怨。确实,我的密钥库中出现了一个新的apk文件,而我的应用程序的proguar