- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
测试环境:Ubuntu 18.04.3 LTS g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0。
std::mutex 可以重入吗?为什么下面的测试代码1会通过?
代码1:
#include <iostream>
#include <mutex>
std::mutex g_mtx4val;
int g_val = 5;
void test() {
std::lock_guard<std::mutex> lck(g_mtx4val);
std::cout << "g_val=" << g_val << std::endl;
if (g_val > 0) {
--g_val;
test();
}
}
int main() {
test();
std::cout << "done ...." << std::endl;
return 0;
}
peanut@peanut:~/demo$ g++ test.cpp
peanut@peanut:~/demo$ ./a.out
g_val=5
g_val=4
g_val=3
g_val=2
g_val=1
g_val=0
done ...
代码2:
// Same code 1
int main() {
std::thread t1(test);
t1.join();
std::cout << "done ...." << std::endl;
return 0;
}
peanut@peanut:~/demo$ g++ test2.cpp -lpthread
peanut@peanut:~/demo$ ./a.out
g_val=5
^C
peanut@peanut:~/demo$
code2 有一个死锁。为什么code1可以通过测试?
最佳答案
mutex offers exclusive, non-recursive ownership semantics
所以标题问题的答案是否定的。
Can std::mutex be reentrant?
不,但是如果你想要一个递归互斥锁,std::recursive_mutex class提供该功能。
Why does the following test code 1 pass?
您希望看到什么行为? std::mutex 文档页面简单地说:
A calling thread must not own the mutex prior to calling lock or try_lock.
...它没有说明如果调用线程违反上述规则会发生什么;这意味着违反规则的程序可能“看起来可以工作”,但即便如此仍然是不正确的和错误的。
关于c++ - std::mutex 是递归的(即不可重入)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64853011/
嗨,我已经阅读了 Java 中的 ReadWriteLock,但我不确定我是否掌握了它的重入部分。这是两个仅使用一个主线程来显示重入的简短代码示例 public class Locks { p
我在使用 NotifyIcons 时发现了一个重入问题。重现它真的很容易,只需在表单上放置一个 NotiftIcon,点击事件应该如下所示: private bool reentrancyDetect
我正在尝试使用 SQLite 的新 C 接口(interface)预更新 Hook : https://www.sqlite.org/c3ref/preupdate_count.html 现在回答我的
来自阅读here我发现 Actor 是可重入的,并且我希望以下情况成立:如果我有单一类型的转换 ThespianType 但有三个特定的 Actor ThespianType (T1、T2 和 T3)
有人可以向我解释一下 BlockReentrancy 的目的是什么吗?方法在ObservableCollection ? MSDN显示以下内容作为示例: //The typical usage is
我是一名优秀的程序员,十分优秀!