2012-03-25 10 views
3

Ich wollte wissen, wie implementieren meine eigene Threading-Bibliothek.
Was ich habe, ist eine CPU (PowerPC-Architektur) und die C Standard Library.Threading Implementierung

Gibt es eine Open-Source-Implementierung mit geringem Gewicht, die ich betrachten kann?

+0

Welche Plattform/Betriebssystem? –

+2

Sie benötigen mehr als die C-Standardbibliothek, da Sie in der Lage sein müssen, mit Hardware-Interrupts usw. zu interagieren. –

+0

Ich habe diese Fähigkeit mit Xilinx PowerPC 440 API – socksocket

Antwort

2

An seinem einfachsten ein Thread benötigen:

  1. Einige Speicher für Stapelspeicher
  2. Irgendwo seinen Kontext zu speichern
(dh Registerinhalte, Programmzähler, Stapelzeiger, usw.).

Darüber hinaus müssen Sie einen einfachen "Kernel" implementieren, der für die Thread-Umschaltung verantwortlich sein wird. Und wenn Sie vorbeugende Threads implementieren möchten, benötigen Sie auch eine periodische Quelle von Interrupts. z.B. ein Timer. In diesem Fall können Sie Ihren Thread-Switching-Code im Timer-Interrupt ausführen.

Schauen Sie sich die Routinen setjmp()/longjmp() und die entsprechende Struktur jmp_buf an. Dadurch erhalten Sie einfachen Zugriff auf den Stapelzeiger, so dass Sie Ihren eigenen Stapelspeicherplatz zuweisen können, und Sie erhalten eine einfache Möglichkeit, alle Registerinhalte zu erfassen, um den Kontext Ihres Threads bereitzustellen.

In der Regel ist die longjmp() -Funktion ein Wrapper für eine Rückkehr von Interrupt-Anweisung, die sehr gut mit Thread-Scheduling-Funktionalität in der Timer-Interrupt passt. Sie müssen jedoch die Implementierung von longjmp() und jmp_buf für Ihre Plattform überprüfen.

Suchen Sie nach Thread-Implementierungen auf kleineren Mikroprozessoren, die in der Regel keine Betriebssysteme haben. z.B. Atmel AVR oder Microchip PIC. Zum Beispiel: discussion on AVRFreaks

0

Vielleicht könnten Sie sich C++ anschauen, das Threading unterstützt. Ich würde damit beginnen, einige ihrer nützlichsten Grundelemente (zum Beispiel Futures) auszuwählen, zu sehen, wie sie funktionieren und eine einfache Implementierung durchführen.

+2

C++ hat nur natives Threading ab C++ 11. Und es ist durchaus möglich, dass ein Compiler für eine Bare-Metal-Umgebung (d. H. Kein Betriebssystem) dies nicht unterstützt. –

+0

Ich empfehle nicht, er sollte es verwenden. Er versucht zu lernen, was zu tun ist. – usr

+0

Oh, ich verstehe. Nun, ich würde mir vorstellen, dass die zugrunde liegende Implementierung auf der Threading-API des Betriebssystems beruht. –

1

Für eine anständige Thread-Bibliothek benötigen Sie:

  • atomare Operationen Rennen zu vermeiden (implementieren zB einen Mutex)
  • einig OS-Unterstützung der Planung zu tun und damit beschäftigt zu vermeiden
  • einig OS warten Unterstützung, um den Kontextwechsel zu implementieren

Alle drei verlassen den Umfang dessen, was C99 Ihnen bietet. Atomare Operationen werden in C11 eingeführt, bisher scheinen C11-Implementierungen nicht bereit zu sein, daher werden diese normalerweise in Assembler implementiert. Für die späteren zwei müssen Sie sich auf Ihr Betriebssystem verlassen.