可以說你想在C#中的數據結構異步添加項目。C#線程奇觀
因此,通過一步程序的典型步驟通常如下:
List1.add(variable1);
List2.add(variable2);
List3.add(variable3);
...等。
是否有可能異步執行此操作?
我也會說,每個列表或其各自的變量之間沒有依賴關係。
這可以做得很好嗎?
可以說你想在C#中的數據結構異步添加項目。C#線程奇觀
因此,通過一步程序的典型步驟通常如下:
List1.add(variable1);
List2.add(variable2);
List3.add(variable3);
...等。
是否有可能異步執行此操作?
我也會說,每個列表或其各自的變量之間沒有依賴關係。
這可以做得很好嗎?
我也會說,每個列表或其各自的變量之間沒有依賴關係。
這可以做得很好嗎?
是的,只要每個線程都有自己的列表,就沒有問題了。
和簡單的方式來做到這一點:
Parallel.Invoke(
() => List1.add(variable1),
() => List2.add(variable2),
() => List3.add(variable3)
);
在另一方面,List<>.Add()
是一個非常小的和快速的方法,所以你不會看到這樣做的好處很多。當2+列表需要同時內部增長時,纔有收益。有更好的方法來處理這個問題。
第一次提到'你不會看到這麼做的好處'。如果添加的項目很小,例如。一個指針/參考,我希望這個好處會是負面的。如果該項目很大,則可能應該已經添加爲指針/參考
@MartinJames - 我認爲這更多的是關於interanl重新分配。 'Add()'通常是O(1),但有時O(n) –
我不知道內部存儲器是如何擴展自己的 - 每次耗盡時可能會加倍,也許realloc需要一個副本,不要知道。仍然看起來不是一個很好的併發性候選人,所有的線程信號都在進行,調度/分派線程等。我懷疑三個線程池會被推到三個核心上,只是爲了移動三個變量,(可能只是int /指針/ refs)列表中:(( –
是的,你可以做到。當只有*一個*列表由多個*線程填充時,您將只會遇到麻煩。 – oleksii
+1僅用於標題 –
對於所有線程,您是否有多個列表或共享列表? – Tudor