2011-03-25 70 views
0

已经发布了关于同一问题的疑问,但我认为答案开始走向其他方向,所以我会尝试着重我的问题: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; 
} 

谢谢大家:)

+0

我从来没有得到过关于在C++标记中回答这些问题的废话。指定您使用的*精确*处理器品牌,型号和步进,主板芯片组和编译器型号以及版本号,并运行此代码。可以肯定的是,请提及案件的颜色。 – 2011-03-25 02:17:37

+0

编译器是gcc 4.5,我知道处理器有两个核心,但我在大学工作,不知道模型或任何其他信息。无论如何,我需要知道,如果使用线程会导致程序执行速度较慢,这是因为缓存未命中。 – Kitinz 2011-03-25 02:36:20

+0

我已经评论了我对原始问题的回答,并提供了有关性能和数据竞赛的其他信息。 – 2011-03-25 08:07:50

回答

1

1)不,你并不需要保护的载体,如果你保证写入不同的地址。

2)你真的只需要在你的机器上测试这些东西。尝试单线程与交错访问与分割访问并仅仅计时结果。