2012-09-04 70 views
1

可以說你想在C#中的數據結構異步添加項目。C#線程奇觀

因此,通過一步程序的典型步驟通常如下:

List1.add(variable1); 

List2.add(variable2); 

List3.add(variable3); 

...等。

是否有可能異步執行此操作?

我也會說,每個列表或其各自的變量之間沒有依賴關係。

這可以做得很好嗎?

+0

是的,你可以做到。當只有*一個*列表由多個*線程填充時,您將只會遇到麻煩。 – oleksii

+0

+1僅用於標題

+0

對於所有線程,您是否有多個列表或共享列表? – Tudor

回答

5

我也會說,每個列表或其各自的變量之間沒有依賴關係。
這可以做得很好嗎?

是的,只要每個線程都有自己的列表,就沒有問題了。

和簡單的方式來做到這一點:

Parallel.Invoke(
    () => List1.add(variable1), 
    () => List2.add(variable2), 
    () => List3.add(variable3) 
); 

在另一方面,List<>.Add()是一個非常小的和快速的方法,所以你不會看到這樣做的好處很多。當2+列表需要同時內部增長時,纔有收益。有更好的方法來處理這個問題。

+0

第一次提到'你不會看到這麼做的好處'。如果添加的項目很小,例如。一個指針/參考,我希望這個好處會是負面的。如果該項目很大,則可能應該已經添加爲指針/參考。 –

+0

@MartinJames - 我認爲這更多的是關於interanl重新分配。 'Add()'通常是O(1),但有時O(n) –

+0

我不知道內部存儲器是如何擴展自己的 - 每次耗盡時可能會加倍,也許realloc需要一個副本,不要知道。仍然看起來不是一個很好的併發性候選人,所有的線程信號都在進行,調度/分派線程等。我懷疑三個線程池會被推到三個核心上,只是爲了移動三個變量,(可能只是int /指針/ refs)列表中:(( –