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?
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