[英]`pthread_mutex_t`, `sem_t` in a `std::map`
基本上我是为一堆对象维护一组状态:
#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_t
存储在一个数组中吗?
如果任何线程正在修改地图本身(插入等),则需要保护对地图的所有访问。 在那之后:如果成员只是一个bool
,你可以对它进行多少处理,将这个时间添加到地图级别互斥锁所持有的时间会改变任何东西。
否则:如果你需要每个对象的互斥锁,那么简单的解决方案就是将它们放在与地图上的对象相同的对象中。 但它mutex_t
复制? pthread_mutex_t
和std::mutex
不是。 这可能会使插入代码过于复杂,因为在插入对象之前无法初始化pthread_mutex_t
或构造std::mutex
。 (在C ++ 11中,你可以使用emplace
来解决这个问题;如果你使用emplace
,地图的内容就不必是可复制的。)但是,在C ++ 03中,你必须将分配与初始化分开; 包含映射值的struct
和互斥体实际上必须用互斥锁的原始内存声明,然后使用新的贴片来使用从insert
返回的迭代器来初始化它。
如果您有多个线程读取和写入mutex_array
,您将需要另一个互斥锁来保护它。
你确定你会有多个线程写入mutex_array
吗?
另一件事是,您可以拥有一个map<subscription_type, object_struct>
,而不是拥有两个映射
struct object_struct {
bool valid;
pthread_mutex_t mutex;
};
然后有一个单独的互斥锁来保护该地图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.