gpt4 book ai didi

c++ - `pthread_mutex_t` , `sem_t` 在 `std::map`

转载 作者:行者123 更新时间:2023-11-30 02:55:17 25 4
gpt4 key购买 nike

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

#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 存储在一个数组中?

最佳答案

如果任何线程正在修改 map 本身(插入等),您需要保护对 map 的所有访问。之后:如果member 只是一个 bool,你可以在上面做多少处理它将这个时间添加到映射级别互斥锁的时间会改变任何事情。

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

关于c++ - `pthread_mutex_t` , `sem_t` 在 `std::map`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16586958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com