是否有一个最小的块大小,多个线程可以在连续的内存块中写入,以避免竞争条件或丢失值?
例如,32个线程可以写入该数组的各个元素而不影响其他值吗?
int array[32];
这个怎么样?
bool array[32];
将简单的true / false存储到位数组中的对象怎么样?
我猜测有一些块写入大小或缓存相关的功能会起作用来决定这一点。那是对的吗?关于这个尺寸(平台定义等),有什么标准/安全吗?
答案 0 :(得分:3)
是否有一个最小的块大小,多个线程可以在连续的内存块中写入,以避免竞争条件或丢失值?
没有。只有当两个线程访问相同的内存位置(即相同的字节)时,才会发生冲突(和潜在的数据竞争)。访问不同对象的两个线程不会冲突。
例如,32个线程可以写入该数组的各个元素而不影响其他值吗?
是的,每个元素都有自己的内存位置,因此访问不同元素的两个线程不会冲突。
这个怎么样?
是;再次,每个bool
都有自己的位置。
将简单的true / false存储到位数组中的对象怎么样?
没有;将多个值打包到一个更大的元素中,两个访问相同更大元素的线程会发生冲突。
我猜测会有一些块写入大小或缓存相关的功能可以决定这一点。
当多个线程访问同一个缓存行时,可能会对性能产生影响(称为 false sharing );但语言保证只要它们不访问相同的内存位置,它就不会影响程序的正确性。
答案 1 :(得分:1)
标准中没有选民。如果您需要独占访问元素,可以使用std::atomic
。您可以使用:
std::vector<std::atomic<int> > array;
否则您可以随时使用std::mutex
。
32个线程可以写入该数组的各个元素而不影响其他值吗?
如果一个线程与其他线程发生冲突,您可以自由地执行此操作。即thread i
仅修改array[i]
的值。