2010-05-11 2 views
12

Es gibt eine Frage bezüglich des Unterschieds zwischen Mutex und Critical Abschnitt, aber es geht auch nicht um Locks.Unterschied zwischen Locks, Mutex und kritischen Abschnitten

Also ich möchte wissen, ob kritische Abschnitte für die Thread-Synchronisation zwischen Prozessen verwendet werden können.

Auch was durch signalisierte Staaten und nicht-signalisierten Staaten

+2

Sie sind die gleiche Sache für mich, meine Vermutung ist, dass Sie eine Bibliothek verwenden, die einen Unterschied zwischen den drei (Win32?) Macht. –

+0

Willst du sagen, dass Locks wie CSingleLock auch Thread-Synchronisation unterstützt, wenn es darum geht, Prozesse übergreifend zu führen. Ich dachte, nur Mutex unterstützt das. Bitte korrigieren Sie mich, wenn ich falsch liege – ckv

Antwort

7

In Windows sind kritische Abschnitte (meistens) im Benutzermodus implementiert und ein Mutex wechselt den Kontext in den Kernel-Modus (was langsam ist). Wenn ein Thread endet, während er einen Mutex besitzt, wird gesagt, dass der Mutex aufgegeben wird. Der Status des Mutex wird auf Signalisiert gesetzt, und der nächste wartende Thread erhält Besitz. In der gleichen Situation mit einem kritischen Abschnitt bleiben alle anderen Threads blockiert. Kritische Abschnitte können nicht benannt werden, sodass Sie sie nicht zum Synchronisieren mehrerer Prozesse verwenden können.

+0

"kritische Abschnitte sind vollständig im Benutzermodus implementiert" <- Nicht ganz richtig. Kritische Abschnitte werden eher nachgeben als sich zu drehen, wenn sie genügend Zeit haben. –

2

CriticalSections sind in Prozess gemeint ist. Benannte Mutexe können über Prozesse hinweg verwendet werden

Lock ist ein allgemeiner Begriff und als solcher würde ich nicht wissen, welche Plattform Sie meinen. Zum Beispiel ist in C# ein Sperrgrundelement ein kritischer Abschnitt.

+0

Und Locks sind auch in Bearbeitung richtig? – ckv

2

1) Critical Section ist die Brücke zwischen Benutzer- und Interlocked-Operationen. Es verwendet intra-ausgetauschte Operationen, um Ihre Threads zu sperren und zu entsperren. Es funktioniert schneller als Mutexe.

2) Mutex ist ein Kernal-Objekt. Es funktioniert nicht schnell, hat aber einige Vorteile. Zuallererst können benannte Mutexe über Prozesse hinweg verwendet werden. Zweitens, wenn der Thread beendet wird, wird der von diesem Thread gesperrte Mutex entsperrt.

3

Kritische Abschnitte sind keine Kernel-Objekte. Sie sind nicht mit einem Handle identifiziert. Sie können nur verwendet werden, um die Threads zu synchronisieren, die zu demselben Prozess gehören. Sie können nicht für die Synchronisierung über den gesamten Prozess hinweg verwendet werden.

CSingleLock (ich nehme an, dass Sie dies als eine Sperre in diesem Zusammenhang beziehen) ist eine Wrapper-Klasse mit RAII Konzept. Es hilft Ihnen, das Thread-Synchronisationsobjekt (in seinem Konstruktor) zu erhalten und Lock and Unlock API auf einfache Weise aufzurufen. (alle internen Details werden ausgeblendet, welche Synchronisationsobjekte verwendet werden).

CSingleLock kann bei Verwendung mit kritischen Abschnitten nicht prozessübergreifend verwendet werden. Wo als Mutex kann für diesen Zweck verwendet werden.

Wenn ein Thread Mutex erwirbt und keine anderen Threads den Mutex abrufen können, wird der Status des Mutex als nicht signiert angegeben. Wenn der Mutex verfügbar ist und keine Threads erfasst wurden, befindet er sich im Signalled-Status.