【发布时间】:2013-05-16 12:05:18
【问题描述】:
基本上我为一堆对象维护一组状态:
#define SUBSCRIPTION_TYPE int
std::map< SUBSCRIPTION_TYPE , bool > is_object_valid;
我需要用各自的mutex_t(而不是大锁)保护is_object_valid 中的每个元素。由于SUBSCRIPTION_TYPE 的有效值是稀疏(例如,从 0 到 10000000 的几十个值),std::map 优于 std::vector、C 样式数组等。
我正在尝试实现以下目标:
std::map< SUBSCRIPTION_TYPE , pthread_mutex_t > mutex_array;
但它似乎不起作用。 (嗯,std::map 更新时可能会发生数据竞争)。
那么实现这一目标的最佳方法是什么?我必须编写一个线程安全的订阅分配器,将SUBSCRIPTION_TYPE 映射为连续整数,以便我可以将mutex_ts 存储在一个数组中吗?
【问题讨论】:
-
全地图锁定有什么问题?
-
@zch 呃,效率不够。程序的一部分依赖于远程过程调用,因此不必要地阻塞多个线程太昂贵了。
-
您没有显示足够的代码来进行真正的诊断,但我有一些猜测:当您将互斥锁“插入”到地图中时,您实际上是在创建一个新的互斥锁。所以你需要初始化它并锁定它。您从中复制的互斥锁现在没用了。因此,请确保您有时不会锁定原件,有时会锁定地图中的那个。
-
@WanderingLogic 他应该能够推迟初始化地图中的互斥锁,直到它实际在地图中。
std::pair<Map::iterator, bool> r = myMap.insert( make_pair<int, pthread_mutex_t>( newKey, pthread_mutex_t() ) ); assert( r.second ); pthread_mutex_init( &r.first->second, NULL );之类的东西当然,他必须在整个序列中保持地图上的全局锁定。
标签: c++ concurrency stl pthreads