在一种方法中使用两个boost mutex?

时间:2011-11-10 17:19:48

标签: 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);

...

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

1 个答案:

答案 0 :(得分:2)

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

另外,如果你有很多互斥锁,你必须小心,始终以相同的顺序获取并释放它们,否则你将陷入僵局:

mutex MutexAB;
mutex MutexBC;

主题A

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

主题B

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

这些线程会死锁。

相关问题