QSystemSemaphore Class
Die Klasse „QSystemSemaphore“ stellt einen allgemeinen Semaphor für Zählsysteme bereit. Mehr...
| Header: | #include <QSystemSemaphore> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Öffentliche Typen
| enum | AccessMode { Open, Create } |
| enum | SystemSemaphoreError { NoError, PermissionDenied, KeyError, AlreadyExists, NotFound, …, UnknownError } |
Öffentliche Funktionen
| QSystemSemaphore(const QNativeIpcKey &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open) | |
| QSystemSemaphore(const QString &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open) | |
| ~QSystemSemaphore() | |
| bool | acquire() |
| QSystemSemaphore::SystemSemaphoreError | error() const |
| QString | errorString() const |
| QString | key() const |
| QNativeIpcKey | nativeIpcKey() const |
| bool | release(int n = 1) |
| void | setKey(const QString &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open) |
| void | setNativeKey(const QNativeIpcKey &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open) |
Ausführliche Beschreibung
Ein System-Semaphor ist eine Verallgemeinerung von QSemaphore. In der Regel wird ein Semaphor verwendet, um eine bestimmte Anzahl identischer Ressourcen zu schützen.
Wie sein „leichteres“ Pendant kann auf ein `QSystemSemaphore` von mehreren ` threads` aus zugegriffen werden. Im Gegensatz zu ` QSemaphore` kann auf ein `QSystemSemaphore` auch von mehreren ` processes` aus zugegriffen werden. Das bedeutet, dass `QSystemSemaphore` eine wesentlich schwerfälligere Klasse ist. Wenn Ihre Anwendung also keinen prozessübergreifenden Zugriff auf Ihre Semaphoren benötigt, sollten Sie wahrscheinlich ` QSemaphore` verwenden.
Semaphoren unterstützen zwei grundlegende Operationen: ` acquire()` und ` release()`:
acquire() versucht, eine Ressource zu erwerben. Ist keine Ressource verfügbar, wird der Aufruf blockiert, bis eine Ressource verfügbar wird. Anschließend wird die Ressource erworben und der Aufruf kehrt zurück.
release() gibt eine Ressource frei, sodass sie von einem anderen Prozess beansprucht werden kann. Die Funktion kann auch mit einem Parameter n > 1 aufgerufen werden, wodurch n Ressourcen freigegeben werden.
System-Semaphoren werden durch einen Schlüssel identifiziert, der durch ` QNativeIpcKey` dargestellt wird. Ein Schlüssel kann plattformübergreifend mithilfe von `platformSafeKey()` erstellt werden. Ein System-Semaphor wird vom Konstruktor von `QSystemSemaphore` erstellt, wenn ihm der Zugriffsmodus-Parameter ` AccessMode::Create` übergeben wird. Nach der Erstellung können sich andere Prozesse unter Verwendung desselben Schlüssels und des Zugriffsmodus-Parameters ` AccessMode::Open` an denselben Semaphor anhängen.
Beispiel: Erstellen eines System-Semaphors
QSystemSemaphore sem(QSystemSemaphore::platformSafeKey("market"), 3, QSystemSemaphore::Create);
// resources available == 3
sem.acquire(); // resources available == 2
sem.acquire(); // resources available == 1
sem.acquire(); // resources available == 0
sem.release(); // resources available == 1
sem.release(2); // resources available == 3Einzelheiten zu den Schlüsseltypen, plattformspezifischen Einschränkungen und der Interoperabilität mit älteren oder Nicht-Qt-Anwendungen finden Sie in der Dokumentation zu nativen IPC-Schlüsseln. Diese enthält wichtige Informationen für Anwendungen in einer Sandbox auf Apple-Plattformen, einschließlich aller Apps, die über den Apple App Store bezogen wurden.
Siehe auch „Inter-Process Communication“, „ QSharedMemory “ und „ QSemaphore “.
Dokumentation zu Mitgliedstypen
enum QSystemSemaphore::AccessMode
Diese Enumeration wird vom Konstruktor und von ` setKey()` verwendet. Sie dient dazu, das Problem in Unix-Implementierungen von Semaphoren zu lösen, die einen Systemabsturz überstehen. Wenn in Unix ein Semaphor einen Systemabsturz übersteht, benötigen wir eine Möglichkeit, die Zurücksetzung seiner Ressourcenzahl zu erzwingen, sobald das System den Semaphor wiederverwendet. Unter Windows, wo Semaphoren einen Systemabsturz nicht überstehen können, hat diese Enumeration keine Auswirkung.
| Konstante | Wert | Beschreibung |
|---|---|---|
QSystemSemaphore::Open | 0 | Wenn der Semaphor bereits existiert, wird seine anfängliche Ressourcenanzahl nicht zurückgesetzt. Wenn der Semaphor noch nicht existiert, wird er erstellt und seine anfängliche Ressourcenanzahl festgelegt. |
QSystemSemaphore::Create | 1 | QSystemSemaphore übernimmt die Eigentümerschaft am Semaphor und setzt dessen Ressourcenanzahl auf den angeforderten Wert, unabhängig davon, ob der Semaphor bereits existiert, weil er einen Systemabsturz überstanden hat. Dieser Wert sollte an den Konstruktor übergeben werden, wenn der erste Semaphor für einen bestimmten Schlüssel erstellt wird und Sie wissen, dass der Semaphor, falls er bereits existiert, nur aufgrund eines Systemabsturzes vorhanden sein kann. Unter Windows, wo ein Semaphor einen Systemabsturz nicht überstehen kann, verhalten sich die Funktionen „Create“ und „Open“ identisch. |
enum QSystemSemaphore::SystemSemaphoreError
| Konstante | Wert | Beschreibung |
|---|---|---|
QSystemSemaphore::NoError | 0 | Es ist kein Fehler aufgetreten. |
QSystemSemaphore::PermissionDenied | 1 | Der Vorgang ist fehlgeschlagen, da der Aufrufer nicht über die erforderlichen Berechtigungen verfügte. |
QSystemSemaphore::KeyError | 2 | Der Vorgang ist aufgrund eines ungültigen Schlüssels fehlgeschlagen. |
QSystemSemaphore::AlreadyExists | 3 | Der Vorgang ist fehlgeschlagen, da bereits ein System-Semaphor mit dem angegebenen Schlüssel existierte. |
QSystemSemaphore::NotFound | 4 | Der Vorgang ist fehlgeschlagen, da ein System-Semaphor mit dem angegebenen Schlüssel nicht gefunden werden konnte. |
QSystemSemaphore::OutOfResources | 5 | Der Vorgang ist fehlgeschlagen, da nicht genügend Speicherplatz zur Verfügung stand, um die Anforderung zu erfüllen. |
QSystemSemaphore::UnknownError | 6 | Es ist etwas anderes passiert, und das war nicht gut. |
Dokumentation der Mitgliedsfunktionen
QSystemSemaphore::QSystemSemaphore(const QNativeIpcKey &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)
Fordert ein System-Semaphor für den angegebenen key an. Die Parameter initialValue und mode werden gemäß den folgenden Regeln verwendet, die systemabhängig sind.
Unter Unix gilt: Wenn der Schlüssel „ mode “ den Wert „ Open “ hat und das System bereits über ein Semaphor verfügt, das durch „ key “ identifiziert wird, wird dieses Semaphor verwendet, und die Ressourcenanzahl des Semaphors wird nicht geändert, d. h., „ initialValue “ wird ignoriert. Wenn das System jedoch noch kein Semaphor mit der Kennung key besitzt, erstellt es ein neues Semaphor für diesen Schlüssel und setzt dessen Ressourcenzahl auf initialValue.
Unter Unix gilt: Wenn der „ mode “ Create lautet und das System bereits über ein Semaphor mit der Kennung key verfügt, wird dieses Semaphor verwendet und seine Ressourcenanzahl auf initialValue gesetzt. Verfügt das System noch nicht über ein Semaphor mit der Kennung key, erstellt es ein neues Semaphor für diesen Schlüssel und setzt dessen Ressourcenanzahl auf initialValue.
Unter Windows wird „ mode “ ignoriert, und das System versucht immer, ein Semaphor für den angegebenen Schlüssel „ key “ zu erstellen. Verfügt das System noch nicht über ein Semaphor mit der Kennung „ key “, erstellt es das Semaphor und setzt dessen Ressourcenanzahl auf „ initialValue “. Verfügt das System jedoch bereits über ein Semaphor mit der Kennung „ key “, verwendet es dieses Semaphor und ignoriert „ initialValue “.
Der Parameter „ mode “ wird nur in Unix-Systemen verwendet, um den Fall zu behandeln, in dem ein Semaphor einen Prozessabsturz übersteht. In diesem Fall erhält der nächste Prozess, der ein Semaphor mit demselben „ key “ zuweist, das Semaphor, das den Absturz überstanden hat, und sofern „ mode “ nicht auf „ Create “ gesetzt ist, wird die Ressourcenanzahl nicht auf „ initialValue “ zurückgesetzt, sondern behält den ursprünglichen Wert bei, der ihr vom abgestürzten Prozess zugewiesen wurde.
Siehe auch acquire() und key().
QSystemSemaphore::QSystemSemaphore(const QString &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)
Fordert ein System-Semaphor an, das durch den Legacy-Schlüssel „ key “ identifiziert wird.
[noexcept] QSystemSemaphore::~QSystemSemaphore()
Der Destruktor löscht das QSystemSemaphore -Objekt, doch das zugrunde liegende System-Semaphor wird erst dann aus dem System entfernt, wenn diese Instanz von QSystemSemaphore die letzte ist, die für dieses System-Semaphor existiert.
Zwei wichtige Nebeneffekte des Destruktors hängen vom jeweiligen System ab. Unter Windows wird, wenn für dieses Semaphor ` acquire()` aufgerufen wurde, aber nicht ` release()`, weder ` release()` vom Destruktor aufgerufen, noch wird die Ressource freigegeben, wenn der Prozess normal beendet wird. Dies wäre ein Programmfehler, der zu einem Deadlock in einem anderen Prozess führen könnte, der versucht, dieselbe Ressource zu erwerben. Unter Unix werden erworbene Ressourcen, die nicht vor dem Aufruf des Destruktors freigegeben wurden, beim Beenden des Prozesses automatisch freigegeben.
bool QSystemSemaphore::acquire()
Erwirbt eine der von diesem Semaphor geschützten Ressourcen, sofern eine verfügbar ist, und gibt ` true` zurück. Wenn alle von diesem Semaphor geschützten Ressourcen bereits erworben wurden, blockiert der Aufruf, bis eine davon von einem anderen Prozess oder Thread freigegeben wird, der über ein Semaphor mit demselben Schlüssel verfügt.
Wird „false“ zurückgegeben, ist ein Systemfehler aufgetreten. Rufen Sie ` error()` auf, um einen Wert von ` QSystemSemaphore::SystemSemaphoreError ` zu erhalten, der angibt, welcher Fehler aufgetreten ist.
Siehe auch ` release()`.
QSystemSemaphore::SystemSemaphoreError QSystemSemaphore::error() const
Gibt einen Wert zurück, der angibt, ob ein Fehler aufgetreten ist und, falls ja, um welchen Fehler es sich handelt.
Siehe auch „ errorString()“.
QString QSystemSemaphore::errorString() const
Gibt eine Textbeschreibung des zuletzt aufgetretenen Fehlers zurück. Wenn error() einen Wert vom Typ „ error value “ zurückgibt, rufen Sie diese Funktion auf, um eine Textzeichenfolge zu erhalten, die den Fehler beschreibt.
Siehe auch ` error()`.
QString QSystemSemaphore::key() const
Gibt den diesem System-Semaphor zugewiesenen Legacy-Schlüssel zurück. Der Schlüssel ist der Name, unter dem von anderen Prozessen auf den Semaphor zugegriffen werden kann.
Siehe auch ` setKey()`.
QNativeIpcKey QSystemSemaphore::nativeIpcKey() const
Gibt den diesem System-Semaphor zugewiesenen Schlüssel zurück. Der Schlüssel ist der Name, unter dem von anderen Prozessen aus auf den Semaphor zugegriffen werden kann.
Sie können den nativen Schlüssel verwenden, um auf Systemsemaphoren zuzugreifen, die nicht von Qt erstellt wurden, oder um Nicht-Qt-Anwendungen Zugriff zu gewähren. Weitere Informationen finden Sie unter „Native IPC-Schlüssel “.
Siehe auch ` setNativeKey()`.
bool QSystemSemaphore::release(int n = 1)
Gibt die vom Semaphor geschützten Ressourcen „ n “ frei. Gibt „ true “ zurück, sofern kein Systemfehler vorliegt.
Beispiel: Erstellen Sie ein System-Semaphor mit fünf Ressourcen; sichern Sie sich alle Ressourcen und geben Sie sie anschließend wieder frei.
QSystemSemaphore sem(QSystemSemaphore::platformSafeKey("market"), 5, QSystemSemaphore::Create);
for (int i = 0; i < 5; ++i) // acquire all 5 resources
sem.acquire();
sem.release(5); // release the 5 resourcesDiese Funktion kann auch Ressourcen „erstellen“. Angenommen, wir fügen unmittelbar im Anschluss an die obige Anweisungsfolge folgende Anweisung hinzu:
sem.release(10); // "create" 10 new resourcesZusätzlich zu den fünf bereits vorhandenen Ressourcen werden nun zehn neue Ressourcen durch das Semaphor geschützt. Normalerweise würden Sie diese Funktion nicht zum Erstellen weiterer Ressourcen verwenden.
Siehe auch ` acquire()`.
void QSystemSemaphore::setKey(const QString &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)
Diese Funktion verhält sich genauso wie der Konstruktor. Sie rekonstruiert dieses QSystemSemaphore -Objekt. Wenn sich der neue Schlüssel key vom alten Schlüssel unterscheidet, entspricht der Aufruf dieser Funktion dem Aufruf des Destruktors des Semaphors mit dem alten Schlüssel, gefolgt vom Aufruf des Konstruktors, um einen neuen Semaphor mit dem neuen Schlüssel key zu erstellen. Die Parameter initialValue und mode sind wie für den Konstruktor definiert.
Siehe auch QSystemSemaphore() und key().
void QSystemSemaphore::setNativeKey(const QNativeIpcKey &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)
Diese Funktion verhält sich genauso wie der Konstruktor. Sie baut dieses QSystemSemaphore -Objekt neu auf. Wenn sich der neue key vom alten Schlüssel unterscheidet, entspricht der Aufruf dieser Funktion dem Aufruf des Destruktors des Semaphors mit dem alten Schlüssel, gefolgt vom Aufruf des Konstruktors, um einen neuen Semaphor mit dem neuen key zu erstellen. Die Parameter initialValue und mode sind wie für den Konstruktor definiert.
Diese Funktion ist nützlich, wenn der native Schlüssel von einem anderen Prozess gemeinsam genutzt wurde. Weitere Informationen finden Sie unter „Native IPC-Schlüssel “.
Siehe auch „ QSystemSemaphore()“ und „ nativeIpcKey()“.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.