Ich möchte das multiple Threading in C implementieren, ohne eine der POSIX-Bibliotheken zu verwenden. Jede Hilfe wäre willkommen.
Nicht: Verwenden Sie nicht fork () oder vfork ().
Siehe:
für UNIX-ähnliche Systeme.
Siehe auch:
für BSDs und moderne Unixes.
Diese Seite enthält viele Beispiele für Barebone-Implementierungen, die diese Grundelemente und mehr verwenden.
Sie können atomare Anweisungen verwenden, um die Sperrgrundelemente (Mutex, Semaphore) zu implementieren.
Ich schlage auch vor, tatsächliche Implementierungen von Userland-Thread-Bibliotheken zu betrachten, um einige Hinweise zu erhalten. Siehe diese Seite , die eine Liste der Implementierungen für Linux enthält.
Abschließend möchten Sie vielleicht Informationen zu Korotinen und vielleicht trampolines , obwohl das spätere nicht so eng verwandt ist.
Ein Thread in Linux ist im Wesentlichen ein Prozess, der Speicher und Ressourcen mit seinem übergeordneten Element gemeinsam nutzt. Der Linux Kernel unterscheidet nicht zwischen einem Prozess und einem Thread, mit anderen Worten, es gibt kein Konzept für einen leichtgewichtigen Prozess in Linux wie in anderen Betriebssystemen. Threads in Linux sind als standard Prozesse implementiert, so dass es möglich ist, einen Thread nur mit clone()
zu erstellen, der normalerweise von fork()
wie folgt aufgerufen wird:
Dies klont die Signalhandler nur, aber mit den entsprechenden Flags können Sie einen Thread erstellen:
%Vor%Dies ist identisch mit dem vorherigen Aufruf, außer dass der Adressraum, Dateisystemressourcen, Dateideskriptoren und Signalbehandlungsroutinen von den beiden Prozessen freigegeben sind.
Ein anderer Ansatz ist die Verwendung von Threads auf Benutzerebene ( (auch Fasern genannt), das sind Threads der Ausführung, die auf Benutzerebene implementiert sind, was bedeutet, dass das Betriebssystem diese Threads nicht kennt und die Planung oder Kontextwechsel auf Benutzerebene erfolgen muss. Die meisten Scheduler auf Benutzerebene sind als kooperative Scheduler implementiert, aber es ist auch möglich, einen preemptive Scheduler mit einer einfachen Round-Robin-Scheduling
Überprüfen Sie die klon (2) man-Seite für Details und wenn Sie weitere Informationen wünschen, empfehle ich die Linux-Kernel-Entwicklung 3. Auflage Von Robert Love, (nicht mit dem Autor in keiner Weise verbunden) gibt es einen Blick in den Link dort könnte etwas davon online lesen. Was die Threads auf Benutzerebene anbelangt, gibt es ein minimales von mir geschriebenes Paket namens libutask , das sowohl eine kooperative als auch eine ein preemptive Scheduler, können Sie den Quellcode überprüfen, wenn Sie möchten.
Anmerkung1: Ich habe UNIX nicht erwähnt, soweit ich weiß, handelt es sich um eine Linux-spezifische Implementierung.
Hinweis2: Erstellen Sie Ihre eigenen Threads mit Klon ist keine echte Welt Lösung, lesen Sie die Kommentare für die einige Probleme, die Sie möglicherweise zu behandeln haben, ist es nur eine Antwort auf die Frage ist es möglich, Threads ohne zu erstellen Pthreads, in diesem Fall ist die Antwort ja.
Man kann mit Sicherheit zumindest einen kooperativen Mikrokernel mit c auf jedem Betriebssystem erstellen. Im Grunde erfordert es nur das Klonen des Stapelrahmens (und das Anpassen einiger Zeiger entsprechend - insbesondere die Rückkehradresse von einer Funktion zu der aktuellen Rückkehradresse der anderen Threads). Und ein paar Utility-Funktionen, wie zum Beispiel "context switch" den Stapel zu haufen und zurück.
Wenn ein Timer-Interrupt mit einem Callback erlaubt ist, kann man einen präventiven Mikrokernel machen.
Zumindest haben Dr. Dobbs und IOCCC Optionen in dieser Richtung vorgestellt.
Tags und Links c multithreading unix systems-programming