Hier ist der Kontext: Ich schreibe einen Interpreter in C # für eine kleine Programmiersprache namens Heron , und es hat einige primitive Listenoperationen, die parallel ausgeführt werden können.
Eine der größten Herausforderungen für mich besteht darin, die vom Evaluator geleistete Arbeit effektiv auf die verschiedenen Kerne zu verteilen, wenn eine parallelisierbare Operation stattfindet. Dies kann eine kurze oder lange Operation sein, es ist schwierig im Voraus zu bestimmen.
Eine Sache, um die ich mir keine Sorgen machen muss, ist das Synchronisieren von Daten: Die parallelen Operationen dürfen Daten nicht explizit ändern.
Die Hauptfragen, die ich habe, sind also:
Ich bin auch an einer verwandten Frage interessiert:
Wenn Sie viel mit parallelen Operationen machen wollen, sollten Sie mit .Net 4.0 beginnen. Hier ist die parallele Programmierung für .Net-Dokumentation . Sie sollten hier starten . .Net 4.0 fügt eine Menge in Bezug auf Multi-Core-Nutzung hinzu. Hier ist ein kurzes Beispiel:
Aktuell 3.5 Serielle Methode:
%Vor%New .Net 4.0 Parallele Methode:
%Vor%Die Parallel.For Methode skaliert automatisch über die Anzahl der verfügbaren Kerne, können Sie sehen, wie schnell Sie davon profitieren könnten. Es gibt Dutzende von neuen Bibliotheken im Framework, die volle Thread / Task-Verwaltung unterstützen, wie auch Ihr Beispiel (einschließlich aller Verrohrungen für die Synchronisierung, Löschung usw.).
Es gibt Bibliotheken für Parallel LINQ (PLINQ) , Task Factories , Task Scheduler und ein paar andere. Kurz gesagt, für die spezifische Aufgabe, die Sie angelegt haben .Net 4.0 hat große Vorteile für Sie, und ich würde gehen weiter und schnappen Sie sich die kostenlose Beta 2 ( RC bald ) und los geht's. (Nein, ich arbeite nicht für Microsoft ... aber selten sehe ich, dass eine kommende Version ein Bedürfnis so perfekt erfüllt, also empfehle ich .Net 4.0 für Sie)
Ich würde mit Thread-Pool gehen, obwohl es seine Probleme hat, MS investiert in Verbesserung und es scheint, als ob .NET 4 eine verbesserte haben wird. An diesem Punkt denke ich, dass das beste Ding wäre, den Thread-Pool in Ihrem eigenen Objekt zu verwenden und mit der Entscheidung über Ihre eigene Implementierung zu warten
Tags und Links .net c# multithreading performance multicore