假设我有一个长度为4的std::vector<int>
,它是常数。然后有4个线程,其中线程i
只读取和写入索引i
。这线程安全吗?单个元素可以彼此独立地更改吗?我想知道因为它们很接近所以它们可能一下子被加载到高速缓存行中。
如果每个线程的索引范围大于1,它会有所不同吗?
编辑:
我使用的是Visual Studio 2010,因此使用的是C ++ 03。欢迎任何有关C ++ 03到C ++ 11差异的提示!
答案 0 :(得分:2)
是的,没关系。不同的线程可以在不同的元素范围内运行。
根据C++11
标准:
23.2.2 容器数据竞赛 [container.requirements.dataraces]
2 尽管如此(17.6.5.9),当同时修改除了vector&lt; bool&gt;之外的同一序列中的不同元素中的包含对象的内容时,需要实现以避免数据争用。
编辑:在C++11
之前从未提及并发和数据竞争,因此规范没有考虑它们并且不做任何保证。