2009-07-07 6 views
1

Die meisten der Multithread-Arbeit, die ich getan habe, war in C/C++, Python oder Delphi (Object Pascal). Alles unter Windows. Ich werde Delphi für meine Diskussion hier verwenden. Delphi hat eine nette Klasse namens TThread, die den Thread-Erstellungsprozess abstrahiert. Die Klasse stellt eine Execute-Methode bereit, die die Thread-Funktion des erstellten Threads ist. Sie überschreiben diese Methode und erstellen in der Regel eine Schleife, die beim Beenden des Threads beendet wird. Sie tun die Arbeit des Threads innerhalb der Schleife.Hat jemand eine Programmiersprache gesehen, die solche Threads behandelt?

Eine der wiederkehrenden Aufgaben besteht darin, genau zu verfolgen, welcher Code im Threadkontext ausgeführt wird und welcher Code von externen Threads in einem externen Kontext ausgeführt wird, wobei Synchronisierungsobjekte die von den Threads freigegebenen Daten schützen. Alles grundlegende Thread-Programmierungskram. Eine der wiederkehrenden Belästigungen ist das Erstellen von Funktionen, die es externen Threads ermöglichen, Daten zu senden oder abzurufen, und Daten von öffentlichen threadsicheren Speicherobjekten zu denen, die für den Thread privat sind, und umgekehrt zu verschieben.

Ich frage mich, ob jemand jemals eine Programmiersprache gesehen hat, die das einfacher macht? Hier ist, was ich als Programmier-Thread-Idiom lieben würde. Nehmen wir eine Delphi-TThread-Unterklasse, die für diese Diskussion erstellt wurde. Angenommen, ich könnte Klassenmethoden mit einem der drei Schlüsselwörter Private, PublicExecuteInAnyContext oder PublicExecuteInPrivateContext markieren. So würden sie arbeiten.

Private: Private Methoden werden nur im Kontext des Threads ausgeführt. Der Compiler fügt automatisch Code hinzu, der eine Ausnahme auslöst, wenn ein Codepfad dazu führt, dass diese Methode in einem Kontext außerhalb des Host-Threads ausgeführt wird. (Z. B. - "Fehler, Versuch, die Methode private auszuführen, um $ AEB vom Thread $ EE0 zu thread").

PublicExecuteInAnyContext: Methoden, die als solche markiert sind, können von dem Thread aufgerufen werden, der die Methode und einen externen Thread besitzt. Alle Datenobjekte, auf die in diesen Methoden Bezug genommen wird, werden automatisch mit Synchronisationsobjekten geschützt. Sie können die Standardauswahl überschreiben und eigene hinzufügen. (Mutex oder Semaphore statt Critical Section, etc.)

PublicExecuteInPrivateContext: Methoden mit diesem Begriff markiert im Thread Kontext ausführen würde, sind aber von jedem Thread aufrufbar. Diese Option würde zwei Strategien für den Umgang mit Aufrufen solcher Methoden durch externe Threads ermöglichen:

1) Modus 1 - Block aufrufende Thread: der aufrufende Thread würde blockieren, bis die Methode zurückgegeben wird. Mit anderen Worten, der Compiler würde automatisch Code schreiben, um den aufrufenden Thread zu blockieren. Alle vom aufrufenden Thread übergebenen Parameter werden in private Variablen des Host-Threads kopiert. Die Methode wird erst ausgeführt, wenn der Host-Thread die Kontrolle erhalten hat. Wenn der Host-Thread die Methode beendet, wird der aufrufende Thread freigegeben, und die Ergebnisse werden von der Methode zurückgegeben, die in den eigenen privaten Variablenbereich kopiert wird.

2) Modus 2 - Blockieren Sie den aufrufenden Thread nicht: Dies würde das zusätzliche Argument einer Callback-Funktion ermöglichen. Alle Parameter, die von einem externen Thread an die Methode übergeben werden, werden in den privaten Variablenbereich des Threads kopiert. Der Compiler würde die Ausführung der Methode erneut durchführen, bis der Host-Thread die Kontrolle erhalten hätte, aber den aufrufenden Thread ohne Blockierung weiterlaufen lassen. Wenn der Host-Thread die Ausführung der Methode abgeschlossen hat, würde eine Rückruffunktion die Funktion ** aufrufen, aber im Kontext des ursprünglichen Threads, der die Methode aufgerufen hat, und nicht im Host-Thread-Kontext **.

Eine Sprache, die diese Art von automatischen Thread-Handling bieten würde, würde für mich zumindest viel mehr Spaß machen, Multithreading mit der Art und Weise zu tun, wie ich es jetzt tun muss. Hat jemand eine Programmiersprache oder ein Modul/Hack für eine der Mainstream-Sprachen gesehen, die diese Art von Multithreading-Modell bietet?

Antwort

3

Ich denke nicht, dass es genau Ihrer Beschreibung entspricht, aber Erlang bietet eines der einfachsten Parallelitätsmodelle, die ich gesehen habe. Es verwendet einen Share-Nothing-Ansatz, der für Sie vielleicht ansprechend klingt oder nicht, aber ich fand es sehr interessant. Es ist auch sehr einfach, verteilte Systeme damit zu erstellen, wenn Sie es jemals brauchen. Check out "Getting Started with Erlang", es ist ein großartiges Tutorial, das fast alle Teile der Sprache abdeckt.

+1

Ja, die Dokumentation lesen. Spiel mit Erlang. Es wurde entwickelt, um einfach zu bedien zu schaffen, leicht, verarbeitet mit einem geringen Speicherbedarf. http://erlang.org/doc/reference_manual/processes.html – marcc

0

Wollte zu erwähnen. LabVIEW macht das Starten mit Multi Threading wirklich zum Kinderspiel. Ich habe gerade einige Artikel über das Internet, die tatsächlich diese in einer besseren Art und Weise erklärt:

Wenn Sie in einer traditionellen, textuellen Sprache vor, kann das Datenflussparadigma von Labview programmiert haben etwas schwer zu Umarmung. Das Datenfluß Paradigma festgelegt, dass es spielt keine Rolle, wo auf der 2D Oberfläche des Blockdiagramms eine bestimmte Komponente in Beziehung zu anderen Komponenten platziert ist, aber was andere Komponenten es verdrahtet ist. Ein bestimmter Komponentenknoten führt nicht aus, bis alle seine Eingaben verfügbar sind; Es wird jedoch ausgeführt als bald, wie alle seine Eingänge verfügbar sind, unabhängig davon, was sonst zur gleichen Zeit ausgeführt werden könnte, das ist - parallel zu potenziell vielen anderen anderen Dingen.

Sie benötigen umfangreiche Erfahrungen mit Multi-Threading-Programmierung in einer traditionellen Sprache jedoch auf wirklich zu schätzen, wie einfach es zu ist mit LabVIEW Multi-Threading erreichen und wie natürlich die Parallelität entsteht - ob absichtlich, oder nicht. Während LabVIEW magisch nicht alle auf parallele Verarbeitung Herausforderungen im Zusammenhang lösen, ist es sicherlich macht es wesentlich einfacher damit den Start. In der Tat, im Gegensatz mit den traditionellen sequentiellen Text-Programmiersprachen, ist es die sequentielle Ausführung, die bei kommt ein Preis in LabVIEW - Parallelität ist fast frei.

von http://saberrobotics.org/?id=34 Genommen