Critical Section vs. Create Mutex (war Threadnekromantie in: Mutex, kleines Beispielprogramm)
-
Ich finde diesen 6 Jahre alten Beitrag interessant und würde gerne mal zu Critical Sections und mutex nachhaken.
Critical Sections sind schlanker.
mutex etwas mächtiger aber kostet mehr Ressorcen.
**
Wie schaut es Platformübergreifend aus?**Ich denke, das mutex auch unter Linux funktionieren.
Bei Critical Sections habe ich nur Windows im Kopf
-
koja schrieb:
Bei Critical Sections habe ich nur Windows im Kopf
Klar, Windows ist im Durchschnitt auch deutlich besser
-
Unter Linux heißt das glaube ich futex
-
koja schrieb:
Ich denke, das mutex auch unter Linux funktionieren.
Bei Critical Sections habe ich nur Windows im Kopf"Mutex" ist ein abstraktes Konzept.
Sowohl Linux als auch Windows bieten konkrete Implementierungen dieses Konzepts an.
Eine dieser Implementierungen wird unter Windows als Mutex bezeichnet, wird mit CreateMutex erstellt, ist prozessübergreifend und ein Kernel-Objekt.
Eine andere Implementierungen wird unter Windows als CRITICAL_SECTION bezeichnet, wird mit InitializeCriticalSection/InitializeCriticalSectionAndSpinCount/InitializeCriticalSectionEx erstellt, ist prozesslokal und ein Usermode-Objekt. (Und hauptsächlich deswegen immens viel schneller, speziell mit "not contended" Fall.)Die Frage was Linux hier konkret zu bieten hat lass überlass ich mal den Linux-Experten.
-
kmutant schrieb:
Unter Linux heißt das glaube ich futex
hustbaer schrieb:
Die Frage was Linux hier konkret zu bieten hat lass überlass ich mal den Linux-Experten.
Die erste Antwort sieht wie ein Scherz aus, aber die Dinger heißen wirklich Futex. Das ist ein Userspaceobjekt mit einer Warteschlange im Kernelspace. Dadurch sind diese Objekte sehr schnell, so lange man sie nur von einem Prozess (mit möglicherweise mehreren Threads) aus benutzt. Aber man kann eben auch mehrere Prozesse darüber synchronisieren, wenn man möchte.
Aber so direkt wird man in Anwendungsprogrammen normalerweise keinen Futex nutzen, dass ist bloß der Ansatzpunkt für Threadbibliotheken (genau genommen ist der Futex selbst auch noch kein vollständiger Mutex). NPTL (also die native pthread-Implementierung des Gespanns GNU/Linux) setzt beispielsweise seine Mutexe mittels Futexen um. Die Standardbibliotheken (und natürlich auch nicht-Standardbiblitheken) diverser, höherer Programmiersprachen werden dann wiederum oftmals intern pthreads (egal welcher Implementierung) benutzen. Und als Anwendungsprogrammierer ist es eine dieser Ebenen (pthreads oder höher), auf denen man meistens arbeitet, also ganz weit weg von den Futexen. Da ist auch die Frage, wo genau man die Grenze zieht, zwischen Betriebssystem und Anwendung. Streng genommen kennt Linux halt nur Futexe, aber so ziemlich alles, was man als "Linux" bezeichnet ist ja eigentlich GNU/Linux und hat somit mindestens die NPTL-Implementierung (oder halt irgendeine andere) der pthread-API. Insofern kann man auch sagen, dass pthreads (und seine Mutexe) "die" Threads für Linux wären. Auf dieser Ebene gibt es dann auch wieder mehr Konzepte und ihre konkrete Umsetzung, wie zum Beispiel Semaphoren (eine Art verallgemeinerter Mutex); die dann intern ggf. auch mittels Futexen implementiert sind, aber wo es einen eigentlich nicht kümmern braucht, was die intern machen, man muss bloß das Konzept und seine pthread- (oder höhere) Schnittstelle verstehen.
Ansonsten das was hustbaer gesagt hat: Mutex ist ein Konzept, die konkrete Umsetzung kann stark variieren. Es gibt beispielsweise auch Threadingbibliotheken die rein im Userspace laufen, ganz ohne Kernelunterstützung, aber trotzdem pthread-konform (oder auch nicht pthread-konform, das ändert aber nichts). Die haben natürlich auch ihre eigenen Mutexe, die intern aber natürlich ganz anders funktionieren als die Mutexe der NPTL. Wird's gewiss auch unter Windows geben.
PS: Es gilt übrigens als äußerst unhöflich, sehr alte Threads hervor zu kramen. Die Leser müssen dadurch erst seitenweise alte Information lesen, die sich aber oft als komplett irrelevant heraus stellt. Dieser Thread ist geradezu ein Musterbeispiel dafür: Die einzige Verbindung der neuen Frage zum alten Verlauf des Threads ist, dass es um Threads :p und Mutexe geht. Kein einziger der Beiträge vor dem Nekropost relevant.
Ich habe die neue Diskussion daher abgetrennt. Wenn nicht bereits relevante Antworten gekommen wären, hätte ich solch einen Beitrag auch einfach stillschweigend gelöscht.
-
Danke für die ausführlichen Antworten.
Wenn ich einen neuen Beitrag geschrieben hätte, dann währe wohl als Antwort: "Benutz die Suche!, das Thema wurde schon tausend mal durchgekaut" gekommen.
Nochmal Dankeschön
-
koja schrieb:
Wenn ich einen neuen Beitrag geschrieben hätte, dann währe wohl als Antwort: "Benutz die Suche!, das Thema wurde schon tausend mal durchgekaut" gekommen.
Nur, wenn das Thema schon tausend mal durchgekaut worden ist. Was es anscheinend nicht ist, denn du hast ja offenbar gesucht.