我遇到了涉及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);
...
我想要一个性能最受关注的解决方案。
答案 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);
这些线程会死锁。