问题标签 [recursive-mutex]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 递归和非递归锁(互斥锁)
我的程序出现死锁问题。所以我一直在阅读有关锁的信息,但问题是大多数信息不一致或没有平台定义。在递归锁(互斥锁)与非递归锁(互斥锁)中,最被接受的答案是:
因为递归互斥体有归属感,所以抓取互斥体的线程必须是释放互斥体的同一个线程。在非递归互斥锁的情况下,没有所有权感,任何线程通常都可以释放互斥锁,无论哪个线程最初获取互斥锁。在许多情况下,这种类型的“互斥锁”实际上更像是一种信号量操作,您不必将互斥锁用作排除设备,而是将其用作两个或多个线程之间的同步或信号设备。
在评论中人们说这是不正确的,也没有关于它的参考。所以...
1)如果我在线程A中锁定了一个非递归互斥锁。线程B可以在不抓住锁的情况下解锁它吗?
2)如果线程A和线程B调用非递归互斥锁获取锁,线程B会等到锁被释放再获得锁,还是会抛出异常?递归互斥体中的这种情况怎么样?(也在其他无法得出正确结论的问题中讨论)
3)当使用递归锁时,在进程终止时,我所有的递归锁都必须被释放吗?(取决于不会发生的过程结束的地方)
4) 谨慎使用递归锁和非递归锁的组合时,我在看什么问题?
PS:仅使用 windows 平台和std::thread
.
c++ - 如何避免 recursive_mutex
我有一个我正在尝试解决的 recursive_mutex 案例。这是解释问题的一段代码。
OnConnectionDisconnected 在多个线程 (n) 上调用,并且 ShutdownServer 在连接处于活动状态或断开连接时仅在一个线程上调用。ShutdownServer 遍历所有连接并在每个连接上调用 Disconnect,间接调用 OnConnectionDisconnected 我实际上删除了连接。我在访问 m_IPCSyncConnectionSet 之前锁定了互斥锁,因为连接集在其他线程中被修改。
我需要在上面的示例代码中使用 recursive_mutex,因为当调用 Shutdown 时,互斥锁在同一个线程上被锁定了两次。
谁能建议我如何解决上述问题并避免 recursive_lock ?根据这篇文章,recurive_mutex 会杀了你http://www.fieryrobot.com/blog/2008/10/14/recursive-locks-will-kill-you/
谢谢,
c++ - unique_lock 可以与 recursive_mutex 一起使用吗?
根据this,unique_lock
可以通过声明 a 用于递归锁定std::unique_lock<std::recursive_mutex>
,实际上编译得很好。
但是,从检查代码(gcc 4.8.2 和 4.9.0)看来,unique_lock
它不遵循_Mutex.lock
,而是实现了 lock 方法本身:
显然,这可以防止互斥锁的递归锁定,实际上尝试递归锁定会引发resource_deadlock_would_occur
异常。
我在这里遗漏了什么,这是一个错误,还是 unique_lock 的文档是错误的?
蒂亚!!!
c++ - 为什么动作 Listing_6.1 中的 C++ 并发不使用 std::recursive_mutex
我正在阅读“C++ Concurrency In Action”一书,对清单 6.1 中使用的互斥锁有一些疑问,代码片段如下:
该pop
方法锁定互斥体,然后调用空互斥体。但是互斥锁不是recursive_mutex,并且代码可以正常工作。std::mutex
所以我怀疑和之间的实际区别是什么std::recursive_mutex
。
c++ - recursive_mutex 的最大所有权级别的下限?
拥有一个对象的线程可以
recursive_mutex
通过调用该对象来获得额外的所有权级别。未指定单个线程可以获得多少级别的所有权。如果一个线程已经获得了一个对象的最大所有权,额外的调用将会失败,额外的调用将会抛出一个类型的异常。lock()
try_lock()
recursive_mutex
try_lock()
lock()
system_error
“最大拥有权”是否存在大于 1 的下限?递归 pthread 互斥锁呢?
c++ - 移动 unique_lock到另一个线程
我想知道当你移动一个unique_lock
持有 a 的 a时会发生什么recursive_mutex
。
具体来说,我正在查看这段代码:
这个示例代码的输出让我很惊讶。in main()怎么unique_lock
知道线程释放了互斥锁?这是真的吗?
c - C - 互斥体属性
我可以只创建和使用一个互斥锁属性来初始化多个递归互斥锁吗?或者我是否必须为要创建的每个互斥锁创建一个互斥锁属性?基本上我下面的代码正确吗?
c++ - 访问 std::recursive_mutex 使用的所有者计数器
我有一个案例,我的算法决策基于共享的深度std::recursive_mutex
。
我读过递归互斥锁持有某种使用计数,并且每次调用锁定/解锁时都会增加和减少它,有没有办法访问该信息?
python - 是否可以通过 ctypes 方便地访问 _thread.RLock 的计数?
可以通过从类继承并从底层属性公开数据来创建属性count
。threading._RLock._count
这很容易通过示例来证明:
_thread.RLock
是否可以通过获取计数来做同样的事情ctypes
?- 如果可能,该代码是否比上面显示的版本有任何优势?
- 如果有利的话,必须编写什么代码才能访问计数?
c++ - 在单个线程中拥有多个读取器锁
我有数据加上一个Lock = boost::shared_mutex
. 我正在锁定数据访问
读卡器锁 ReadLock = boost::shared_lock<Lock>
和 作家锁 WriteLock = boost::unique_lock<Lock>
。
显然,可能有很多读者一次读取数据,而只有一个人在写入。但这里有一个问题:
单个线程可能在同一个互斥锁上具有多个读锁,因为它正在调用本身锁定数据的函数(使用 a ReadLock
)。但是,正如我所发现的,这会导致互锁:
- 线程 1 读取锁定数据 (Lock1)
- 线程 2 使用写锁 (LockW) 等待
- 线程 1 生成另一个读锁 (Lock2),而 Lock1 仍然存在
现在我得到一个锁,因为Lock2
正在等待LockW
退出,LockW
正在等待Lock1
,并且Lock1
因为Lock2
.
我不知道是否可以更改设计,使每个线程只执行一个ReadLock
. 我相信拥有一个让Writers 挨饿的系统会解决我的问题。如何处理我的案件有通用的方法吗?