我有一个unordered_map的unordered_map,它存储对象的指针。无序映射被多个线程共享。我需要遍历每个对象并执行一些耗时的操作(例如通过网络发送它等)。我如何锁定多个unordered_map,以免它被阻止太久?

typedef std::unordered_map<string, classA*>MAP1;
typedef std::unordered_map<int, MAP1*>MAP2;
MAP2 map2;
pthread_mutex_lock(&mutexA) //how could I lock the maps? Could I reduce the lock granularity?
for(MAP2::iterator it2 = map2.begin; it2 != map2.end; it2++)
{
  for(MAP1::iterator it1 = *(it2->second).begin(); it1 != *(it2->second).end(); it1++)
  {
    //perform some time consuming operation on it1->second eg
    sendToNetwork(*(it1->second));
  }
}
pthread_mutex_unlock(&mutexA)

最佳答案

您可以将所有这些对象存储在List等其他结构中,并对其进行迭代,从而不必锁定地图。

您还可以尝试创建数据副本并处理副本-这样,在处理副本时可以修改地图。

10-06 13:56