Ich experimentiere an der Optimierung einiger mathematischer Operationen mit C# .net in einem Paket namens Grasshopper (Teil von Rhino3D). Die Operation ist ziemlich einfach, aber die Liste, auf der sie ausgeführt werden muss, ist groß und kann viel größer werden.C# .net Multithreading
Ich benutze Parallel.ForEach und Listen in meinem C# -Skript und die Anzahl der endgültigen Ergebnisse, die ich bekomme, ist niedriger als erwartet. Dies liegt wahrscheinlich daran, dass list.add nicht Thread-sicher ist (oder nicht threadsicher in der Software, auf der ich es aufbaue).
private void RunScript(double z, int x, List<double> y, ref object A)
{
List<double> temp = new List<double>();
double r;
System.Threading.Tasks.Parallel.ForEach(y, numb =>
{
r = Math.Pow((numb * x), z);
temp.Add(r);
});
A = temp;
Bitte helfen Sie mir diesen einfachen mathematischen Betrieb läuft über eine einfache und effiziente Art und Weise herauszufinden, mehrere hundert Werte CPU Multithreading (oder wenn Sie Vorschläge über GPU CUDA).
Ich hoffe, dass die obskure und spezifische Software Sie nicht stört, denn soweit ich weiß, funktioniert es identisch mit normalen C# .Net/Python/VB.Net.
Ja, höchstwahrscheinlich der List.Add nicht THREAD ist und intern auf Fragen in der Liste führen kann. Ein weiteres Problem ist, dass Sie die lokale Variable r zwischen den ausführenden Threads ohne Synchronisierung teilen. Die lokale Variablendefinition sollte sich innerhalb des ausführenden Blocks befinden oder sogar besser in den List.Add-Methodenaufruf eingebunden werden. –
Anstelle von 'List' könnten Sie' ConcurrentBag' versuchen, das Thread-sicher ist: [MSDN] (https://msdn.microsoft.com/en-us/library/dd381779%28v=vs.110%29. aspx) – Thaoden
Nur ein Vorschlag: Versuchen Sie, einen spezifischeren Fragetitel zu schreiben. Der Inhalt der Frage ist gut und vollkommen gültig, aber der Titel ist auch wichtig. – chris