【发布时间】:2014-04-26 18:53:55
【问题描述】:
我有一个大数组double*,多个线程写入它。
我用boost::mutex 保护每个写入,但这会引入争用并使一切变得非常缓慢,几乎不并行。
有没有更好的方法来控制对我的阵列的多线程写访问?
具体来说,我如何利用这一点,在我的例子中,数组是稀疏的,每个线程通常写入数组的不同部分;并发写入同一个索引应该很少见,并且主要发生在少数数组索引上。
编辑:准确地说,每个线程在多个数组索引上使用+= 增加值。
【问题讨论】:
-
写入大部分是分段的(即,线程写入数据相距很远?)在争用时旋转是否可以接受(即,它真的很少见,优先级反转不是问题吗?)内存开销是否更大比阵列本身可以接受,还是即使在其他地方增加成本也要避免?你有 C++11 支持吗?如果不是,您的线程内存模型是什么?
-
对数组的访问是连续发生的,还是有保证不被访问的时段?
-
被操作的索引是否相邻?
-
A
double*不是数组。它是一个指针。 -
附带说明,如果
double数组真的很稀疏,那么将其实现为数组确实效率低下。您可能要考虑改用map。
标签: c++ arrays multithreading