陣列寫我在我的多線程程序的塊,其執行以下操作的操作:數據在多線程環境
void func(args){
do computation;
for(i = 0; i < n ; i++)
value[i] += computed_value;
}
多個線程將執行該功能。所以我需要使用鎖使程序線程安全。鎖定使程序比單線程程序慢。我試過使用鎖定,但它使程序非常慢。也請建議一些替代方法。
陣列寫我在我的多線程程序的塊,其執行以下操作的操作:數據在多線程環境
void func(args){
do computation;
for(i = 0; i < n ; i++)
value[i] += computed_value;
}
多個線程將執行該功能。所以我需要使用鎖使程序線程安全。鎖定使程序比單線程程序慢。我試過使用鎖定,但它使程序非常慢。也請建議一些替代方法。
根據你的代碼,你沒有任何鎖。作爲一種方法,我會使用鎖而不是鎖。 (沒有更多的澄清,我無法幫助那麼多)。如果可以的話,只需將計算中的操作鎖定即可。
的僞例
int computation(int i)
lock();
i = i + 1;
unlock();
return i;
問題是相當普遍的,所以這裏有響應的一些總體思路:
底線是你不能讓多個線程讀取/寫入同一塊記憶在同一時間。鎖定有關記憶的讀寫是一種方法。這可以用你自己的鎖定,或者使用原子+ =函數(如果有的話)。
有我能想到的其他兩個一般選擇:
1)具有每個線程負責陣列的單獨部分。例如,如果您的數組中有4個線程和20個元素,則線程1可以在元素0-4上運行,線程2在元素5-9上運行,依此類推。
2)爲每個線程分別創建一個數組副本,然後將數組副本組合到一個最終數組中。例如,如果您的數組中有4個線程和20個元素,則線程1將在副本1上運行,在副本2上運行線程2,依此類推。他們完成後,你將不得不將4個陣列合併爲1.
顯然第二個想法需要更多的內存,但我們不太瞭解你的問題的參數,所以這些只是一些一般的想法。
你能告訴我們你的鎖在你提供的代碼中的位置嗎? –
你在哪裏/你是如何鎖定的?線程究竟在做什麼,它們是否都在相同的陣列上運行?你想做什麼? – melak47
不知道任何細節,它看起來像是可以使用原子加法操作而不是完全鎖定的東西。 – Laserallan