2012-12-22 14 views
5

Mein Spiel verwendet eine Multi-Threading-Architektur erstellen, mit den Fäden wie folgt aufgebaut:mehrere Threads auf derselben Hardware-Einheit

  • Main: verantwortlich für die Architektur auf hoher Ebene
  • Ressourcen: verantwortlich für asynchrone Datei-I/O
  • Netzwerk: verantwortlich für Netzwerk blockiert E/A-
  • Arbeiter: tun CPU-intensiven Arbeitsplätze

Momentan gibt es (hardware_threads - 3) Worker-Threads, einen für jede nicht verwendete Hardware-Einheit, aber ich möchte noch einen hinzufügen, indem ich die "Resources" - und "Network" -Threads auf eine Einheit zusammenstelle, da beide Threads ausgegeben werden viel Zeit im Leerlauf.

  1. Ist das in C++ mit boost :: thread möglich?
  2. Ist das überhaupt eine lohnende Optimierung?
+0

* "Ist das überhaupt eine lohnende Optimierung?" * - wahrscheinlich nicht. – Pubby

+1

Std :: Thread ist im Standard. Denken Sie darüber nach, dies zu verwenden. –

+0

Std :: Thread funktioniert nicht ordnungsgemäß auf Windows-Systemen. Es ist funktional das selbe wie boost :: thread sowieso, also wenn ich mal zum umschalten brauche ist das einfach. – jmegaffin

Antwort

5

Sie haben Recht, dass dies eine schlechte Idee ist. Einen Thread für ein Jobdesign zu haben klingt einfach, aber es ist wirklich nicht - besonders wenn einige Jobs schwerer sind als andere. Außerdem haben Sie nicht genug Threads erstellt. Normalerweise möchten Sie ein paar mehr als das, um Spielraum in anderen Threads zu berücksichtigen, die gerade nicht ausgeführt werden.

Das grundlegende Problem hier ist, dass Sie ein eigenes Threading-Backend implementieren. Das ist eine schlechte Idee. Sie müssen zu etwas wie TBB übergehen, das sich mit all diesen Dingen beschäftigt, und diese Ingenieure bei Intel haben viel länger daran gearbeitet und gearbeitet als Sie.

Ob das eine lohnende Optimierung ist, naja, wahrscheinlich nicht. Machen Sie einfach genug Arbeiter und halten Sie sie geladen, und die Ressourcen/Netzwerk-Thread, die blockieren, wird nicht wirklich viel Unterschied machen.

+0

Das habe ich mir gedacht. Ich wollte nur wissen, ob es sich überhaupt lohnte, diese zusätzliche Hardwareeinheit auszuquetschen, aber ich denke nicht. – jmegaffin

1

Die Threads eignen sich hervorragend zum Verteilen von Arbeit und zum Vermeiden von etwas, das darauf wartet, dass etwas passiert, was nicht wirklich wichtig ist, wenn wir jetzt warten. Die Verwendung von Threads ist definitiv eine gute Idee für Ihr Design.

Wie viele Threads sollten Sie haben, und ob es "wert" ist, mehr oder weniger Threads zu haben? Das ist eine viel schwierigere Frage zu beantworten. Für CPU-intensive Threads ist es wirklich sinnlos, mehr als CPU-Kerne im System zu haben, da Sie nicht mehr mit weiteren Threads arbeiten müssen [es gibt immer noch Softwarearchitektur-Gründe, um mehr Threads zu haben, aber das ist normalerweise so weil die Software viel zu komplex wird und hoffentlich kommt man nicht hin ...]

Für Dinge, die warten, und daher nicht viel CPU verbrauchen, ist die Anzahl der Threads mehr von "was auch immer es macht im Code leicht zu handhaben "- Tausende zu haben ist offensichtlich eine schlechte Idee, aber ein oder zwei oder drei werden keinen großen Unterschied machen. Sie haben offensichtlich das gleiche Problem mit "Wie sage ich dem Thread, was als nächstes zu tun ist, und wann muss ich auf das Ergebnis warten ...", usw. Ein leerer Thread tut dem System nicht viel Leistung - es nimmt eine kleine Menge an Stapelspeicher und eine noch kleinere Menge an Thread-Steuerungsdaten auf, aber es ist so eine kleine Menge, dass es nicht wirklich wichtig ist, wenn Sie nicht viele davon haben.

Zusammenfassend, wahrscheinlich "viel schreien für sehr wenig Wolle", wie der blinde Mann sagte, als er das Schwein geschoren - mit anderen Worten, viel Arbeit, nicht viel Nutzen.

+0

Nein. Sie müssen mehr Threads verwenden, da alle Threads für kleine Beträge blockieren, z. B. Speicherzuordnungen oder Systemaufrufe. Es ist normalerweise am besten, ein paar Threads bereit zu haben, um jederzeit laufen zu können. – Puppy

+0

Richtig, ich bezog mich auf Threads, die überhaupt nicht warten (z. B. einfach einen Datenstrom ausspucken, und wenn ein Artikel nicht aufgebraucht ist, spuckt er trotzdem den nächsten aus). Aber ja, wenn in irgendeinem der Threads irgendeine Art von Warten involviert ist, dann brauchen Sie mehr Threads als die Anzahl der verfügbaren CPUs, um die volle Nutzung der CPUs sicherzustellen. –

Verwandte Themen