我遇到了涉及 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/