并发std :: vector写入的效率

时间:2017-01-17 14:55:15

标签: c++ multithreading optimization vector thread-safety

根据http://en.cppreference.com/w/cpp/container#Thread_safety,可以安全地从不同的线程写入一个std::vector的不同元素。

但如果value_type小于CPU的字大小(或hardware destructive interference size),如(std::vector<char>),这是否意味着对元素的访问效率低于它可能没有线程安全的要求吗?

例如,读/写访问是否意味着内存栅栏/原子指令?

2 个答案:

答案 0 :(得分:2)

是的,它是安全的,标准要求它是安全的。但是,由于所谓的“虚假共享”,它可能效率低下。

当单个线程更新相邻内存(属于同一缓存行)时,会发生错误共享。如果这些线程碰巧在两个不同的内核上执行,它们最终会使两个CPU上的缓存行无效并触发昂贵的缓存更新。

代码编写者应该做出合理的努力,通过尝试将紧密索引分配给同一个线程来减少错​​误共享。

回答我刚才在原帖中看到的问题 - 不,在这样的写作中不会有编译器生成的栅栏。

答案 1 :(得分:0)

符合C ++的实现必须能够写入 let length = data.count let chunkSize = 500 var offset = 0 repeat { // get the length of the chunk let thisChunkSize = ((length - offset) > chunkSize) ? chunkSize : (length - offset); // get the chunk let chunk = data.subdata(in: offset..<offset + thisChunkSize ) // ----------------------------------------------- // do something with that chunk of data... // ----------------------------------------------- // update the offset offset += thisChunkSize; } while (offset < length); 的值,而不需要#34;发明写入&#34;。换句话说,char必须至少与机器对隔离写入所需的一样大。

(由于分层内存中的干扰,从多个线程写入相邻的内存位置可能仍然效率低,但它不会不正确。 )