//上游调用到这里起线程
void DataCenter::start()
{
auto dataMap = getData();
vector ths;
for (const auto& item : dataMap )
{
ths.push_back(boost::thread(boost::bind(&DataCenter::doCompose, this, item.second)));
}
for (vector::iterator it=ths.begin();it!=ths.end() ; ++it)
{
if (it->joinable())
{
it->join(); //doCompose里面访问map冲突卡住还是这么的,这里一直等待...
}
}
//boost::thread_group group;
//for (const auto& item : dataMap )
//{
// group.create_thread(boost::bind(&DataCenter::doCompose, this, item.second));
//}
//group.join_all();
}
//200多行的大方法,有节省
void DataCenter::doCompose(const map > >& data)
{
//....
//因为这里没有加锁,偶发冲突,线程可能卡住了。
//并没有引起整个程序的崩溃,被误为处理得慢了。
WriteLock wLock(m_lockDataMap);
m_dataMap[key] = dt;
//....
}
结论
没有写程序单独验证。只是项目中遇到了,对一个公共成员m_dataMap加下写锁就好了。



