问题标签 [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.

0 投票
4 回答
5143 浏览

c++ - 递归和非递归锁(互斥锁)

我的程序出现死锁问题。所以我一直在阅读有关锁的信息,但问题是大多数信息不一致或没有平台定义。在递归锁(互斥锁)与非递归锁(互斥锁)中,最被接受的答案是:

因为递归互斥体有归属感,所以抓取互斥体的线程必须是释放互斥体的同一个线程。在非递归互斥锁的情况下,没有所有权感,任何线程通常都可以释放互斥锁,无论哪个线程最初获取互斥锁。在许多情况下,这种类型的“互斥锁”实际上更像是一种信号量操作,您不必将互斥锁用作排除设备,而是将其用作两个或多个线程之间的同步或信号设备。

在评论中人们说这是不正确的,也没有关于它的参考。所以...

1)如果我在线程A中锁定了一个非递归互斥锁。线程B可以在不抓住锁的情况下解锁它吗?

2)如果线程A和线程B调用非递归互斥锁获取锁,线程B会等到锁被释放再获得锁,还是会抛出异常?递归互斥体中的这种情况怎么样?(也在其他无法得出正确结论的问题中讨论)

3)当使用递归锁时,在进程终止时,我所有的递归锁都必须被释放吗?(取决于不会发生的过程结束的地方)

4) 谨慎使用递归锁和非递归锁的组合时,我在看什么问题?

PS:仅使用 windows 平台和std::thread.

0 投票
1 回答
498 浏览

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/

谢谢,

0 投票
1 回答
6949 浏览

c++ - unique_lock 可以与 recursive_mutex 一起使用吗?

根据thisunique_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 的文档是错误的?

蒂亚!!!

0 投票
2 回答
118 浏览

c++ - 为什么动作 Listing_6.1 中的 C++ 并发不使用 std::recursive_mutex

我正在阅读“C++ Concurrency In Action”一书,对清单 6.1 中使用的互斥锁有一些疑问,代码片段如下:

pop方法锁定互斥体,然后调用空互斥体。但是互斥锁不是recursive_mutex,并且代码可以正常工作。std::mutex所以我怀疑和之间的实际区别是什么std::recursive_mutex

0 投票
1 回答
181 浏览

c++ - recursive_mutex 的最大所有权级别的下限?

引用[thread.mutex.recursive]

拥有一个对象的线程可以recursive_mutex通过调用该对象来获得额外的所有权级别。未指定单个线程可以获得多少级别的所有权。如果一个线程已经获得了一个对象的最大所有权,额外的调用将会失败,额外的调用将会抛出一个类型的异常。lock()try_lock()recursive_mutextry_lock()lock()system_error

“最大拥有权”是否存在大于 1 的下限?递归 pthread 互斥锁呢?

0 投票
1 回答
1242 浏览

c++ - 移动 unique_lock到另一个线程

我想知道当你移动一个unique_lock持有 a 的 a时会发生什么recursive_mutex

具体来说,我正在查看这段代码:

这个示例代码的输出让我很惊讶。in main()怎么unique_lock知道线程释放了互斥锁?这是真的吗?

0 投票
1 回答
292 浏览

c - C - 互斥体属性

我可以只创建和使用一个互斥锁属性来初始化多个递归互斥锁吗?或者我是否必须为要创建的每个互斥锁创建一个互斥锁属性?基本上我下面的代码正确吗?

0 投票
1 回答
712 浏览

c++ - 访问 std::recursive_mutex 使用的所有者计数器

我有一个案例,我的算法决策基于共享的深度std::recursive_mutex

我读过递归互斥锁持有某种使用计数,并且每次调用锁定/解锁时都会增加和减少它,有没有办法访问该信息?

0 投票
1 回答
161 浏览

python - 是否可以通过 ctypes 方便地访问 _thread.RLock 的计数?

可以通过从类继承并从底层属性公开数据来创建属性countthreading._RLock._count这很容易通过示例来证明:

  1. _thread.RLock是否可以通过获取计数来做同样的事情ctypes
  2. 如果可能,该代码是否比上面显示的版本有任何优势?
  3. 如果有利的话,必须编写什么代码才能访问计数?
0 投票
0 回答
36 浏览

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 挨饿的系统会解决我的问题。如何处理我的案件有通用的方法吗?