1

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

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

而且我需要用它们各自的(而不是大锁)来保护每个元素由于 的有效值是稀疏的(例如,从 0 到 10000000 的几十个值),因此 a 优先于、C 样式数组等。is_object_validmutex_tSUBSCRIPTION_TYPEstd::mapstd::vector

我正在尝试实现以下目标:

std::map< SUBSCRIPTION_TYPE , pthread_mutex_t > mutex_array;

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

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

4

2 回答 2

2

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

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

于 2013-05-16T13:06:50.753 回答
1

如果您有多个线程读取和写入mutex_array,则需要另一个互斥锁来保护它。

你确定你会有多个线程写入mutex_array

另一件事是,您可以拥有一张地图,而不是两张地图map<subscription_type, object_struct>

struct object_struct {
   bool valid;
   pthread_mutex_t mutex;
};

然后有一个单独的弧形互斥锁来保护该映射。

于 2013-05-16T12:16:01.847 回答