因此,它在C#中,基本上我會有一個數組中的位置爲每個線程存儲一些數據。我需要鎖定嗎?例如:多個線程寫入陣列
int[] threads = new int[12];
每個線程將訪問陣列例如在一個特定的位置時,線程1將更新線程的值[0],線程2個線程[1],等等
思想是讓控制檯打印存儲在數組中的值。
好吧有這麼多評論。我想我會澄清我在做什麼,希望我會學到更多。所以基本上它的要點是:
主線程啓動12個獨立的線程,每個線程在主線程中調用一個函數來從數據庫中獲取一堆記錄。對該方法的訪問被鎖定,但它返回大約100條記錄供線程自行處理。
當線程正在處理記錄時,它會發出幾個Web請求並插入到數據庫中。一旦線程完成了一批記錄的處理,它就會再次從主線程調用一個函數,並且該函數將啓動一個新線程來代替最後一個正在完成的線程。
由於線程正在做他們的處理,我想在控制檯中輸出他們的進度。最初我鎖定了每個控制檯的輸出,因爲如果同時調用同一個函數,每個輸出的光標位置將遍佈整個地方。所以我想我會有一個數組存儲每個值的計數,然後有一個函數將它全部打印出來。儘管我開始懷疑這是否與我目前所做的完全不同。
請注意,由於[錯誤分享](https://en.wikipedia.org/wiki/False_sharing),這可能是無效的。除非你非常清楚**你正在做什麼,否則將多個線程寫入通用對象(併發集合除外)永遠不是一個好主意。你應該重構你的程序流程,這樣就沒有必要。 –
我非常同意@KonradRudolph在這裏 - [見我給另一個SO的答案](http://stackoverflow.com/questions/12390468/multithreading-slower-than-singlethreading/12390662#12390662)OP描述的情況其中多線程應用程序比單線程版本慢(包括一個非常好的鏈接到一個優秀的MSDN文章)。我這樣做並不是爲了獲得新答案 - 但是因爲這是一個很少被人理解的現象,人們越多越好:) –
這些傢伙是對的。這聞起來很可怕。記住,你應該像對待員工那樣對待線索:他們很貴,所以不要僱用他們,除非你有很多工作要做。那些線程將大部分時間都閒置,等待數據庫。如果你期待12封信,你會僱用12位祕書在郵箱旁等待嗎?除非他們使你的處理器達到最大化,否則不要創建線程,也不要製造比處理器更多的線程。 –