问题标签 [boost-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++ - 如何正确使用 boost::timed_mutex 和 scoped_lock
我正在尝试将 timed_mutex 与 scoped_lock 一起使用。我之前通过一些示例成功地使用了 scoped_lock,但现在我似乎没有找到解决方法,我也无法正确理解 boost 文档。
期望的行为如下:尝试获取 scoped_lock x 次,如果成功返回 true,否则返回 false。
目前我有:
但是,当我尝试(通过 boost 文档或示例)查找此 scoped_lock 是否会返回布尔值时,我什么也没找到或找到真正不同的方法来做到这一点。
因此,我问哪种方法是正确的,它是如何工作的,也许还有一些关于如何正确“阅读”boost 文档的指示。
更新:
所以
将创建一个互斥锁,当我尝试使用 scoped_lock.owns_lock() 锁定时,它将尝试在 10 毫秒内获取锁(在这种情况下),如果时间到了并且没有获取锁,则返回 false?
c++ - mutex.timed_lock(duration) 和 boost::timed_mutex::scoped_lock scoped_lock(mutex, duration) 的区别
我想知道两者之间有什么区别:
和
我已经知道 scoped_lock 使解锁调用变得不必要。我的问题是指:
- 为什么在第一种情况下我们将 timed_lock 称为互斥锁的成员函数,而在第二种情况下我们从互斥锁和持续时间构造一个锁。
- 哪个效率更高?
- boost::posix_time 的使用是可以的,还是建议使用另一种,例如chrono 或duration?
- 与上面指定的两种方法相比,是否有更好的方法(更快)尝试在“x”时间内获取锁?
boost - boost::unique_locks 是否按照调用顺序授予?
我检查了有关Boost Synchronization的文档,但我似乎无法确定 a 是否boost::unique_lock
会按顺序获得其锁定。
换句话说,如果两个线程竞争锁定一个已经被锁定的互斥体,那么在释放锁之后它们尝试锁定的顺序是否会保持?
c++ - 便携式 c++ boost::iterprocess::mutex,又一次尝试
我一直在寻找用于多处理同步的便携式强大解决方案。接触过这些东西的人都知道,好的解决方案是 boost::iterprocess 命名的同步对象。但是....当您的进程已named_mutex 锁定并且您的进程死亡(进程死亡时有许多正常情况,而不仅仅是错误或其他情况。)在这种情况下,named_mutex 将保持锁定状态。Ion Gaztanaga (www.boost.org/doc/libs/1_55_0/boost/interprocess/detail/robust_emulation.hpp)曾尝试在 boost 代码中制作robust_mutex
他很清楚如何解决放弃状态检查。游戏中的每个进程都有自己的锁定文件,当它处于活动状态时,它会锁定该文件。然后Ion的robust_mutex检查,如果锁定尝试失败,当前所有者进程锁定文件,并且可以确定当前互斥所有者是否活着。如果是死亡互斥锁,可以采取。文件锁的技巧是个好主意,因为如果进程死亡,操作系统会解锁文件锁,这似乎很容易移植。此解决方案包装基本 spin_mutex 并在内部字段中保存当前所有者进程 ID。我进行了密集测试,发现了两个大问题。
文件锁处理和实现方式会减慢互斥锁的速度,因为它更快,只需使用文件锁。
将有效的锁门变量和所有者进程 id 解耦会导致互斥锁可能被不同进程窃取的情况。
我的问题来了:我正在为这两个问题提出解决方案,我很想对此有一些专业的意见。
不要为每个现有进程使用单独的锁定文件,而是为所有最终进程 ID 使用一个文件(应该有足够的 4MB),并且每个进程锁定一个字节。该字节的位置由进程 ID 本身决定。(这不是我的想法,但我在Howard Chu 和他出色的 LMDB的代码中找到了它)
不要按原样包装 spin_mutex,而是重写它的代码,使其用作锁门当前所有者进程 id 而不是 0/1,因此锁定和解锁可以在一个原子 CAS 操作中发生。
我尝试实现它并在 Windows 上进行了测试。我使用原始的 boost 代码并在必要时调用 boost。这是代码。它取自我们的项目树,所以如果你想测试它,你可能必须调整一些包含。这是提议,所以请不要因为代码风格或其他原因责怪我。如果idea和mode好,我会继续完善。如果不是,我将使用其他东西,但我找不到其他东西。
还有 recursive_mutex 和 named_mutex 的版本。然后有一种修复建议,因为如果一个进程获得了所有权先前放弃的互斥锁,则很有可能必须进行某种完整性检查。
我想讨论最终的改进
先感谢您
拉迪斯拉夫。
c++ - 在 std::map 的 find/insert 上使用可升级锁的困惑
以相对简单的形式考虑一个线程安全的 getter 方法:
在上面,我使用共享(可升级)锁来保护查找操作,并且仅当我需要插入键/值时才升级到唯一锁。到目前为止,一切都很好?
我想象的是以下(如果我的概念在任何步骤中是错误的,请告诉我):
两个线程进入方法
两者都允许同时运行
repo.find()
同一个密钥(并且该密钥不存在)。他们都失败了。因为密钥不存在。
第一个线程通过进入升级区域获得独占访问,而第二个线程等待进入升级区域。
第一个线程完成为 key 创建新条目的工作,然后离开。
第二个线程进入并覆盖第一个线程插入的键/值。(这不是任何人想要的)
我们如何解决这个问题?谢谢
c++ - 提升消费者进程中的共享内存和同步队列问题/崩溃
我正在尝试从子进程中使用 C++ 中的同步队列。我在 C++ () ( http://www.internetmosquito.com/2011/04/making-thread-safe-queue-in-ci.html )中使用这个同步队列
我将队列修改为在 boost 中可序列化,并替换了用于boost::mutex io_mutex_
代替使用的进程间互斥锁(感谢@Sehe)boost::interprocess::interprocess_mutex io_mutex_
并且在锁定时我更改了boost::mutex::scoped_lock lock(io_mutex_);
必须scoped_lock<interprocess_mutex> lock(io_mutex_);
}
在我的测试应用程序中,我正在创建同步队列并在其中存储 100 个此类的实例:
消费者和生产者之间的共同定义:
生产者进程代码:
我的消费者代码如下:
当我运行创建队列的父进程(生产者)并创建子(消费者)进程时,子进程在尝试从队列中“弹出”时崩溃。
我在这里做错了什么?任何想法 ?感谢您的任何见解。这是我第一个使用 boost 和共享内存创建的应用程序。
我的目标是能够从多个进程中使用这个队列。在上面的示例中,我只创建了一个子进程,以确保它在创建其他子进程之前首先工作。这个想法是队列将被项目提前填充,并且多个创建的进程将从队列中“弹出”项目而不会相互冲突。
c++ - Boost scoped_lock 每次都失败
在一个类中,我想在这样的函数上使用互斥锁
编译过程没有问题。但是当我执行程序时,boost 总是在这一行失败,说:
我尝试使用lock()
orunlock
方法,但同样的问题。当我使用try_lock
它时,它不会因条件而失败,总是错误的。
在互联网上搜索我发现了这个https://svn.boost.org/trac/boost/ticket/9307。
但我认为问题出在我的程序上,但我不知道在哪里。在我的测试中,这个函数中只有一个线程。
c++11 - 使用 std::mutex 而不是 boost::mutex 时未处理的异常
我尝试摆脱代码中的一些 boost 依赖项,转而使用新的 C++11 功能(Visual Studio 2013)。
在我boost::mutex
一起使用的一个组件中boost::lock_guard<boost::mutex>
,一切正常。相反,当我std::mutex
与 with 一起使用std::lock_guard<std::mutex>
时,从main()
.
GrabberTester.exe 中 0x7721E3BE (ntdll.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0xA6A6B491。
实际项目非常复杂,因此很难提供完整的工作代码示例来重现此问题。在我的真实项目中,互斥锁用于在运行时加载的共享库中(但在我返回时应该已经卸载main()
)。
我的问题是:
boost::mutex
和std::mutex
设计的行为完全一样吗?- 如果不是,有什么区别?
std::mutex
使用代替时我需要记住什么boost::mutex
? - 在共享库中,我正在使用
boost::thread
框架创建线程。难道是std::mutex
只能和s一起使用,和std::thread
s不兼容boost::thread
?
编辑:
我注意到的另一件事是:当我卸载动态加载的共享库时,这需要一些时间。(DLL 访问硬件,需要一些时间才能完全关闭所有内容)。但是,当我切换到std::mutex
时,看起来 DLL 几乎可以立即卸载,但是当从main()
. 我的印象是,问题出std::mutex
在 DLL 的上下文中。
编辑2:
应用程序和 DLL 都是使用 v120 工具集在调试配置中全新构建的,并与运行时库 (/MTd) 静态链接。
编辑3:
您可以在下面找到调用堆栈。异常似乎来自驱动程序的某个地方。只是偶然我发现它与我使用的互斥锁实现有关。
编辑4:
也许这是 OpenNI2 SDK 中的一个错误,只能在这些非常特定的条件下观察到。所以我在这个问题中添加了 openni 标签。但问题仍然存在:为什么它适用于boost::mutex
但不适用std::mutex
?
c++ - 对于 boost::recursive_mutex,boost::thread_group 中的所有线程是否共享同一个线程
我怀疑基于我的代码的行为,如果我有一个 boost::thread_group 访问一个受 boost::recursive_mutex 保护的对象,那么互斥锁不会阻止组内的线程同时进入保护区。
这很令人困惑,因为我看到了调试器(xcode)中列出的所有线程。
这是一个已知的问题?我找不到任何关于它的文档。
c++ - 这是互斥锁的情况吗?
我有一个从设备捕获数据的线程。我从 gui 启动/停止线程。目前,线程会定期检查 appcontext 中的bool
成员 isCapturingEnabled
。我从 gui 切换此bool
成员以停止线程。
这是我应该使用互斥锁的情况吗?因为捕获线程和主线程可能会尝试同时写入和读取bool
。