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;
}
谢谢大家:)
我从来没有得到过关于在C++标记中回答这些问题的废话。指定您使用的*精确*处理器品牌,型号和步进,主板芯片组和编译器型号以及版本号,并运行此代码。可以肯定的是,请提及案件的颜色。 – 2011-03-25 02:17:37
编译器是gcc 4.5,我知道处理器有两个核心,但我在大学工作,不知道模型或任何其他信息。无论如何,我需要知道,如果使用线程会导致程序执行速度较慢,这是因为缓存未命中。 – Kitinz 2011-03-25 02:36:20
我已经评论了我对原始问题的回答,并提供了有关性能和数据竞赛的其他信息。 – 2011-03-25 08:07:50