c++ - 在一种方法中使用两个 boost 互斥体?

标签 c++ multithreading boost

我遇到了涉及 3 个线程的情况。我们称它们为 A、B 和 C。线程 A 和 B 在同一个类中共享静态数据。线程 C 也可能使用相同的静态数据。所以我创建了两个互斥锁。一个互斥体覆盖线程 A 和 B 彼此共享数据。另一个互斥锁负责线程 A 和 C 共享数据。一个互斥体是 boost scoped_lock,另一个互斥体是 lock_guard。我在这里做正确的事吗?基本上,一些方法最终看起来像这样:

      bool CMBTmlBroker::GetTheDatasetListFromTheMB(const std::string &strDatasetTypeShortDisplayName /* use GetTheDatasetTypeShortDisplayName() */,
        const std::string &strDatasetType /* can be blank */,
        const std::string &strProduct /* can be blank */)
      {
        boost::recursive_mutex::scoped_lock scoped_lock(GetLock());

        boost::lock_guard<boost::mutex> DBDatasetKey2DBDatasetInfoMutex(m_DBDatasetKey2DBDatasetInfoMutex);

...

我想要一个最关心性能的解决方案。

最佳答案

thiton 是对的,您应该“每个 protected 数据对象一个互斥量,而不是每个线程对一个”。任何共享的可写数据都必须受到保护,一次只允许一个线程修改,而且没有办法解决这个问题。

另外,如果你有很多互斥体,你必须小心,总是以相同的顺序获取和释放它们,否则你会死锁:

mutex MutexAB;
mutex MutexBC;

线程 A

scoped_lock lAB(MutexAB);
scoped_lock lBC(MutexBC);

线程 B

scoped_lock lBC(MutexBC);
scoped_lock lAB(MutexAB);

这些线程会死锁。

关于c++ - 在一种方法中使用两个 boost 互斥体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8083612/

相关文章:

java - 从 ByteBuffer/Netty ByteBuff 并行/多线程读取

c# - 在 .Net 中阻塞一个线程

c++ - 获取给定日期对应于 ( local_timezone ) 午夜的 time_t/timeval

c++ - 为什么 `using`关键字不能用于静态类成员?

c++ - Qt - 这些代码行是什么意思

c++ - Boost MPL 占位符和 Lambda

c++ - Boost 多数组的 std::vector

c++ - vector 中的简单想法不起作用(编译错误)

java - 更新键/值的集合并不能提供所需的性能

c++ - 在不同平台/gcc 版本上使用 boost 时出现奇怪的行为