Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过不同线程使用迭代器迭代STL映射_C++_Multithreading_Stl_Synchronization - Fatal编程技术网

C++ 通过不同线程使用迭代器迭代STL映射

C++ 通过不同线程使用迭代器迭代STL映射,c++,multithreading,stl,synchronization,C++,Multithreading,Stl,Synchronization,我有一个STL映射,将由两个线程访问。 它们既不插入也不删除元素:它们只是读取 如果它只是一个简单的数组,我相信这永远不会引起麻烦。 然而,STL映射是一个复杂的数据结构,其实现对我来说是未知的。 这会导致数据竞争吗 >标准C++容器(如2011)允许多个并发读卡器安全访问(即通过 const 成员函数)。 也就是说,您没有问题(假设容器使用的类型上的const成员函数遵循相同的规则:按位-const,但受其他线程保护的对象除外) 如果您使用的是旧的实现,理论上可能会有问题,但我对此表示怀疑 下

我有一个STL映射,将由两个线程访问。 它们既不插入也不删除元素:它们只是读取

如果它只是一个简单的数组,我相信这永远不会引起麻烦。 然而,STL映射是一个复杂的数据结构,其实现对我来说是未知的。 这会导致数据竞争吗

>标准C++容器(如2011)允许多个并发读卡器安全访问(即通过<代码> const 成员函数)。 也就是说,您没有问题(假设容器使用的类型上的
const
成员函数遵循相同的规则:按位-
const
,但受其他线程保护的对象除外)

如果您使用的是旧的实现,理论上可能会有问题,但我对此表示怀疑

下面是标准()的库简介部分的全部内容。我认为这些段落中的任何一段都不足以回答你的问题,所以你得到了全部答案

17.6.5.9避免数据竞争[res.on.Data.races]

1本节规定了实施应满足的要求,以防止数据丢失 比赛(1.10)。每个标准库功能应满足以下要求: 要求,除非另有规定。实施可能会阻止 在下列情况以外的情况下进行数据竞争

2的C++标准 库功能不得直接或间接访问对象 (1.10)可由当前线程以外的线程访问,除非 通过函数的 论点,包括这个

3 C++标准库函数不得 直接或间接修改线程可访问的对象(1.10) 除非直接访问对象,否则当前线程除外 或者间接地通过函数的非常量参数,包括这个

4[注:例如,这意味着实现不能使用 用于内部目的的静态对象,而不进行同步,因为 即使在没有显式共享的程序中,也可能导致数据竞争 线程之间的对象。-结束注释]

5 C++标准库函数 不得访问通过其参数或参数间接访问的对象 通过其容器参数的元素,除非通过调用函数 这些容器元件的规范要求

六, 通过调用标准库获得的迭代器上的操作 容器或字符串成员函数可以访问底层 容器,但不得对其进行修改。[注:特别是集装箱 使迭代器无效的操作与上的操作冲突 与该容器关联的迭代器。-结束注释]

七, 实现可以在线程之间共享自己的内部对象 如果对象对用户不可见并且受到数据保护 比赛

8,除非另有说明,C++标准库函数 应仅在当前线程内执行所有操作,如果 操作具有对用户可见的效果(1.10)

9[注:如果没有明显的副作用,这允许实现并行化操作。-结束注]


只要只使用const成员,并且值保持不变(const成员不能在位级别更改任何内容;唯一的例外:线程原语,如
std::mutex
),根据不同版本的begin:(1)迭代器begin()(2)const_迭代器begin()const:我的问题是“我怎么知道会用哪一个“?@takwing如果你有一个
const
对象,你就会得到
const
版本。但是,如果您明确知道需要
const\u迭代器
s,并且不关心上下文中
map
const性,请使用和成员函数。@BoBTFish,按const对象,这是否意味着条目中的值是常量类型?@takwing我的意思是,如果
map
本身是
const
,那么
myMap.begin()
将返回一个
const\u迭代器。由于各种原因,
map
可能是
const
,包括:1)声明方式:
const std::map myMap(使用有限)。2) 它作为
const
类实例的成员访问:
const MyClass myInstance;myInstance.mapMember_u2;.begin()。3) 你在
const
成员函数中访问某个类的成员(基本上是2):
void myClass::foo()const{mapMember_551;begin();}
。啊哈,找到了我要找的:@BoBTFish,所以我的要求得到了保证……谢谢