根据http://en.cppreference.com/w/cpp/container#Thread_safety,可以安全地从不同的线程写入一个std::vector
的不同元素。
但如果value_type
小于CPU的字大小(或hardware destructive interference size),如(std::vector<char>
),这是否意味着对元素的访问效率低于它可能没有线程安全的要求吗?
例如,读/写访问是否意味着内存栅栏/原子指令?
答案 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
必须至少与机器对隔离写入所需的一样大。
(由于分层内存中的干扰,从多个线程写入相邻的内存位置可能仍然效率低,但它不会不正确。 )