线程安全和块写入大小

时间:2013-11-25 15:01:27

标签: c++ arrays multithreading

是否有一个最小的块大小,多个线程可以在连续的内存块中写入,以避免竞争条件或丢失值?

例如,32个线程可以写入该数组的各个元素而不影响其他值吗?

int array[32];

这个怎么样?

bool array[32];

将简单的true / false存储到位数组中的对象怎么样?

我猜测有一些块写入大小或缓存相关的功能会起作用来决定这一点。那是对的吗?关于这个尺寸(平台定义等),有什么标准/安全吗?

2 个答案:

答案 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]的值。