繁体   English   中英

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

[英]`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_tstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM