- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
嗨,Boost 爱好者们
我们遇到了 shared_mutex 的问题,并一直在深入研究 boost 源。我们无法判断这是否是一个死锁情况,或者我们只是不理解共享的读/写锁的互斥实现。
应用:
我们有一张 map map< Ptr*, data>
需要由多个线程创建和查询。但是,大多数 Ptr*
值是常见的,所以有一个快速预热,然后是我们认为是一种几乎没有插入 map 的模式。所以我们想用一个读写器模式来控制对 map 的访问,就像这样
boost::mutex& lock_;
bool found = false;
{
shared_lock<boost::shared_mutex> slock(lock_);
(search the map to see if you have key)
if (keyFound) {
found = true;
}
}
if (!found) {
upgrade_lock<boost::shared_mutex> ulock(lock_);
(search the map again to see if the key has been inserted)
if (key still found) {
upgrade_to_unique_lock<boost::shared_mutex> wlock(ulock);
insert into the map & do whatever
}
}
当 block 超出范围时,应该销毁原始的 shared_lock,如果原始 shared_lock 不成功,则使 upgrade_lock 成为唯一的锁。
观察:
我们所有的线程都在
_lll_lock_wait or pthread_mutex_lock
深入研究 boost::shared_mutex 实现后,我们发现有互斥锁内的一个公共(public)“state_changed”锁,并且为了shared_lock或unique_lock要成功,需要获取普通的state_changed锁用于锁的构造和破坏。似乎 unique_lock 将进入它可能在 state_changed 上释放 scoped_lock 的状态,但我们无法判断。无论哪种方式,我们都不知道为什么线程基本上会长时间锁定有零星的进展 - 这不是一个僵局,而是接近的东西。
感谢任何帮助。
山姆·阿普尔顿
最佳答案
看看 Boost.Thread
change log ,特别是问题#7755“线程:在 Windows 上使用 shared_mutex 死锁”,已在 1.54 中修复。这可能是您遇到的问题。
顺便说一下,自 1.50 以来,许多 Boost.Thread
错误已得到修复,因此值得升级到最新版本。
关于c++ - 1.50 中的 boost::shared_mutex 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27286679/
这真的很奇怪。首先,我不知道您可以删除函数,其次,这发生在外部库中。 错误的情况是我正在使用 QtCreator 构建项目并一起 boost ,没有任何静态库。 使用的编译器是gcc myprogra
我正在尝试编写一个允许多个读者或一个作者访问数据的类。问题是读者可以有条件地成为作家,我想确保无论有多少线程想成为作家,只允许一个,其他线程等待作家完成并变回读者。 问题出在 if(condition
我的印象是,如果获取了太多共享锁,使用 c++17 的 std::shared_mutex 实现的多读/单写模式可能永远不会放弃唯一锁。 在 cppreference 上挖掘之后,我不确定情况是否如此
boost::shared_mutex 或 std::shared_mutex (C++17) 可用于单个写入器、多个读取器访问。作为一项教育练习,我整理了一个使用自旋锁并具有其他限制(例如公平策略)
我有一个小型模板类,它有一个 boost::shared_mutex 类型的非静态成员。每当我尝试编译它时,我都会收到错误: “boost::shared_mutex::shared_mutex”:无
我想将 shared_mutex 与共享/唯一锁一起用于读/写。 现在如果我有 2 个对象并且我希望它们使用相同的锁,我可以将第一个互斥锁的值分配给第二个互斥锁吗? 还是我必须创建一个指向 share
我有一个有几个读者和几个作家的类(class)。我想使用读/写锁(使用shared_mutex) 有关此锁的所有示例和信息,在同一个函数中使用和释放锁: std::shared_mutex 我想以这种
从 C++17(C++14) 开始,我们有了 std::shared_(timed_)mutex 类。很长一段时间以来,Qt 都有一个类似的类 QReadWriteLock。 QReadWriteLo
似乎 Boost 的 shared_mutex 是非递归的.. 周围有吗? (没有重新实现整个东西) 最佳答案 看看this thread这个excellent explanation为什么 shar
我在这个帖子中找到了 HowardHinnant 的答案。 C++11 equivalent to boost shared_mutex 不幸的是,它似乎使用了 Microsoft 编译器 (VS20
C++17 引入了 std::shared_mutex 类型。我一直在查看 CppReference 上的文档对产生未定义行为的情况特别感兴趣。 在通读两种解锁方法(一种用于释放独占所有权,一种用于释
我正在尝试使用 boost::shared_mutex 来实现多读取器/单写入器互斥锁。我的问题很简单,当另一个线程试图锁定该 shared_mutex 以进行写入时,一个线程是否有可能获得对 sha
C++17 引入了 std::shared_mutex 和 std::scoped_lock。我现在的问题是,当它作为参数传递时,scoped_lock 将始终以独占(写入器)模式锁定共享互斥锁,而不
boost::shared_mutex 是否有 C++11 等效项。或者在 C++11 中处理多读/单写情况的另一种解决方案? 最佳答案 我尝试过但未能将 shared_mutex 导入 C++11。
我有许多对象,每个对象都与一个 boost::shared_mutex 相关联(我需要共享/唯一锁功能)。 在代码中的某些场合,我需要一次获得多个对象的唯一所有权。 for (FileMetaData
通常,当使用“普通”互斥量时,您会像在 remove1() 中那样使用它。但是,现在有了 shared_lock 和 unique_lock,是否应该先使用共享锁,只有在必要时才使用唯一锁?请注意,当
查看C++ compiler support , 看来 std::shared_mutex 的未计时版本在 GCC 5.0+ 中可用。但是,即使使用 gcc version 5.3.0 2015120
我有一个多线程应用程序,它必须经常读取一些数据,并且偶尔会更新这些数据。现在,互斥锁可以安全地访问该数据,但它很昂贵,因为我希望多个线程能够同时读取,并且仅在需要更新时将它们锁定(更新线程可以等待其他
你有关于这个主题的任何信息吗?特别是 boost::shared_mutex 和读写器互斥体有什么问题吗? 读写器互斥体可能被滥用,例如即使与简单的互斥体相比,频繁的写入器锁定也会降低性能。但在很多情
嗨,Boost 爱好者们 我们遇到了 shared_mutex 的问题,并一直在深入研究 boost 源。我们无法判断这是否是一个死锁情况,或者我们只是不理解共享的读/写锁的互斥实现。 应用: 我们有
我是一名优秀的程序员,十分优秀!