基本上我是为一堆对象维护一组状态:
#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
存储在一个数组中吗?
答案 0 :(得分:2)
如果任何线程正在修改地图本身(插入等),那么
需要保护对地图的所有访问。之后:如果
成员只是bool
,你可以做多少处理
将此时间添加到地图级别互斥锁的时间
会改变任何事情。
否则:如果你需要每个对象的互斥锁,那么简单的解决方案
将它们放在与地图上的对象相同的对象中。
但它mutex_t
可复制吗? pthread_mutex_t
和std::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;
};
然后使用一个单独的互斥锁来保护该地图。