2013-09-24 93 views
0

陣列寫我在我的多線程程序的塊,其執行以下操作的操作:數據在多線程環境

void func(args){ 
    do computation; 
    for(i = 0; i < n ; i++) 
     value[i] += computed_value; 
} 

多個線程將執行該功能。所以我需要使用鎖使程序線程安全。鎖定使程序比單線程程序慢。我試過使用鎖定,但它使程序非常慢。也請建議一些替代方法。

+0

你能告訴我們你的鎖在你提供的代碼中的位置嗎? –

+0

你在哪裏/你是如何鎖定的?線程究竟在做什麼,它們是否都在相同的陣列上運行?你想做什麼? – melak47

+0

不知道任何細節,它看起來像是可以使用原子加法操作而不是完全鎖定的東西。 – Laserallan

回答

1

根據你的代碼,你沒有任何鎖。作爲一種方法,我會使用鎖而不是鎖。 (沒有更多的澄清,我無法幫助那麼多)。如果可以的話,只需將計算中的操作鎖定即可。

的僞例

int computation(int i) 
    lock(); 
    i = i + 1; 
    unlock(); 
    return i; 
+1

這應該是一條評論。 –

+0

@ g-makulik我加了更多 –

+0

「我試過使用鎖,但是它使得程序非常慢。」 – Appleshell

0

問題是相當普遍的,所以這裏有響應的一些總體思路:

底線是你不能讓多個線程讀取/寫入同一塊記憶在同一時間。鎖定有關記憶的讀寫是一種方法。這可以用你自己的鎖定,或者使用原子+ =函數(如果有的話)。

有我能想到的其他兩個一般選擇:

1)具有每個線程負責陣列的單獨部分。例如,如果您的數組中有4個線程和20個元素,則線程1可以在元素0-4上運行,線程2在元素5-9上運行,依此類推。

2)爲每個線程分別創建一個數組副本,然後將數組副本組合到一個最終數組中。例如,如果您的數組中有4個線程和20個元素,則線程1將在副本1上運行,在副本2上運行線程2,依此類推。他們完成後,你將不得不將4個陣列合併爲1.

顯然第二個想法需要更多的內存,但我們不太瞭解你的問題的參數,所以這些只是一些一般的想法。