- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
根据this , unique_lock
可通过声明 std::unique_lock<std::recursive_mutex>
用于递归锁定,实际上编译得很好。
但是,从检查代码(gcc 4.8.2 和 4.9.0)看来,unique_lock
不服从 _Mutex.lock
,而是自己实现 lock 方法:
void
lock()
{
if (!_M_device)
__throw_system_error(int(errc::operation_not_permitted));
else if (_M_owns)
__throw_system_error(int(errc::resource_deadlock_would_occur));
else
{
_M_device->lock();
_M_owns = true;
}
显然,这可以防止互斥锁的递归锁定,实际上尝试递归锁定会抛出 resource_deadlock_would_occur
异常(exception)。
我在这里遗漏了什么,这是一个错误,还是 unique_lock 的文档有误?
TIA!!!
最佳答案
一个常见的错误是混淆 mutex
与 lock
.一个 mutex
是一个可以在线程之间共享的对象(否则它将无用)。然而,锁本身并不是线程安全的对象。它不应该在线程之间共享。它通常是堆栈上的本地对象。例如:
void foo()
{
std::unique_lock<std::mutex> lk(mut); // mut comes from some other scope
// mut locked here
// ...
} // mut unlocked here
在上面的例子中,如果 foo()
被递归调用,你有未定义的行为,因为你将锁定 mut
递归地。在每次递归时,您都会得到一个新的 unique_lock
尽管。所以unique_lock
不知道递归。如果您确实需要调用foo()
递归,你需要使用递归互斥体,例如:
void foo()
{
std::unique_lock<std::recursive_mutex> lk(mut); // mut comes from some other scope
// mut locked here
// ...
} // mut unlocked here
所以:是的,您可以使用 std::unique_lock<std::recursive_mutex>
,是的,你的实现是正确的。
关于c++ - unique_lock 可以与 recursive_mutex 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27626290/
我有一个 recursive_mutex 案例,我正在尝试解决。这是解释问题的一段代码。 void OnConnectionDisconnected() { boost::l
引用 [thread.mutex.recursive] : A thread that owns a recursive_mutex object may acquire additional lev
在 boost::recursive_mutex::scoped_lock 上调用 unlock() 后,锁定对象是否会在其析构函数中以某种方式引用互斥量? 锁在解锁调用后仍然保留对互斥量的引用(即。
我有一个自定义类,它使用这样的 boost 互斥锁和锁(仅相关部分): template class FFTBuf { public: FFTBuf(); [.
我有以下多态接口(interface): struct service { virtual void connect(std::function(bool) cb); // Inv
当 condition_variable_any 与 recursive_mutex 一起使用时,recursive_mutex 是否通常可从其他线程获取,同时 condition_variable_
我有一个案例,我的算法的决定是基于共享 std::recursive_mutex 的深度。 #include #include #include int g_i = 0; std::recurs
我想知道当您移动包含 recursive_mutex 的 unique_lock 时会发生什么。 具体来说,我正在查看这段代码: recursive_mutex g_mutex; #define TR
根据this , unique_lock可通过声明 std::unique_lock 用于递归锁定,实际上编译得很好。 但是,从检查代码(gcc 4.8.2 和 4.9.0)看来,unique_loc
std::recursive_mutex 在 同一个 线程多次锁定它时不会死锁。 多个线程多次加锁会死锁吗? 最佳答案 Will it deadlock when multiple threads l
我怀疑基于我的代码的行为,如果我有一个 boost::thread_group 访问一个受 boost::recursive_mutex 保护的对象,那么互斥锁不会阻止组内的线程同时进入 protec
boost::recursive_mutex 和 boost::lock_guard 似乎在 C++ Builder 2010 中使用 boost_thread-bcb-mt-1_39.dll。我看到
我看到有人讨厌 recursive_mutex: http://www.zaval.org/resources/library/butenhof1.html 但是当考虑如何实现一个线程安全的类(互斥保
你能不能把 std::recursive_mutex 和 std::condition_variable 结合起来,意思是做这样的事情: std::unique_lock lock(some_recu
我正在阅读《C++ Concurrency In Action》一书,对 list 6.1 中使用的互斥体有一些疑问,代码片段如下: void pop(T& value) { std::loc
我是一名优秀的程序员,十分优秀!