我应该如何保护对共享变量的访问?

时间:2011-03-25 01:49:55

标签: multithreading c++11 mutex

已经对同一问题发表了疑问,但我认为答案开始朝另一个方向发展,所以我会集中讨论我的问题:P

1)需要用一些数据填充一个hughe向量。为了提高速度,我想使用线程来完成工作,所以1个线程可以写入向量的前半部分而另一个线程写入后半部分。

由于每个线程正在访问向量的不同位置......我是否需要保护该访问?

换句话说,我可以同时在这个结构的两个不同位置写入而不保护它吗?

...

using namespace std;

...

main{

int n = 256x1024x1024;
vector<int> vec(n);

thread t1(fillFunction(std::ref(vector), 0, n/2);
thread t2(fillFunction(std::ref(vector), n/2, n);

t1.join;
t2.join;

}

fillFunction(vector<int> &vec, int first, int final){
int i;
for (i = first; i < final; i++){
vec[i] = some_data;
}

}

如果我必须保护访问权限,我应该使用lock_guard还是unique_lock?

2)这个线程解决方案真的会提高速度吗?

我的意思是,即使我保护着作,向量也足够大,不适合缓存。线程写在非常不同的位置,因此'for'将产生如此多的缓存未命中。

这些“缓存未命中”会导致执行速度比没有线程更慢吗?

制作1个线程来填充偶数,而另一个线程使用奇数可以减少缓存未命中数?

thread t1(fillFunction(std::ref(vector), 0, n/2);
thread t2(fillFunction(std::ref(vector), 1, n);

[...]

for (i = first; i < final; i = i+2){
vec[i] = some_data;
}

谢谢大家:)

1 个答案:

答案 0 :(得分:1)

1)如果您保证写入不同的地址,则不需要保护矢量。

2)你真的只需要在你的确切机器上自己测试这些东西。尝试单线程与交叉存取访问与拆分访问,只需对结果进行计时。