'std :: map`中的`pthread_mutex_t`,`sem_t`

时间:2013-05-16 12:05:19

标签: c++ concurrency stl pthreads

基本上我是为一堆对象维护一组状态:

#define SUBSCRIPTION_TYPE int
std::map< SUBSCRIPTION_TYPE , bool > is_object_valid;

我需要保护is_object_valid中的每个元素及其各自的mutex_t(而非大锁)。由于SUBSCRIPTION_TYPE的有效值为稀疏(例如,数字值介于0到10000000之间),std::map优先于std::vector,C风格的数组等等。

我正在努力实现以下目标:

std::map< SUBSCRIPTION_TYPE , pthread_mutex_t > mutex_array;

但它似乎不起作用。 (好吧,在更新std::map时可能会发生数据争用。)

那么实现这一目标的最佳方法是什么?我必须编写一个线程安全的订阅分配器,将SUBSCRIPTION_TYPE映射到连续的整数,以便我可以将mutex_t存储在一个数组中吗?

2 个答案:

答案 0 :(得分:2)

如果任何线程正在修改地图本身(插入等),那么 需要保护对地图的所有访问。之后:如果 成员只是bool,你可以做多少处理 将此时间添加到地图级别互斥锁的时间 会改变任何事情。

否则:如果你需要每个对象的互斥锁,那么简单的解决方案 将它们放在与地图上的对象相同的对象中。 但它mutex_t可复制吗? pthread_mutex_tstd::mutex AREN&#39;吨。这可能会使插入代码过于复杂, 因为你不能初始化pthread_mutex_t或构造 插入对象之前的std::mutex。 (在C ++ 11中,你 可以使用emplace来解决这个问题;地图的内容 如果使用emplace,则不必复制。)在C ++ 03中, 但是,您必须将分配与初始化分开; struct包含您的映射值和互斥锁 实际上必须用互斥锁的原始内存声明,并且 然后放置new用于使用迭代器初始化它 从insert返回。

答案 1 :(得分:1)

如果你有多个线程读写mutex_array,你需要另一个互斥锁来保护它。

您确定要有多个帖子写入mutex_array吗?

另一件事是,您可以拥有map<subscription_type, object_struct>

,而不是拥有两张地图
struct object_struct {
   bool valid;
   pthread_mutex_t mutex;
};

然后使用一个单独的互斥锁来保护该地图。