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