QSystemSemaphore Class

Die Klasse QSystemSemaphore stellt eine allgemeine Zählsystem-Semaphore zur Verfügung. 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)

Detaillierte Beschreibung

Ein System-Semaphor ist eine Verallgemeinerung von QSemaphore. Typischerweise wird ein Semaphor verwendet, um eine bestimmte Anzahl von identischen Ressourcen zu schützen.

Wie sein leichteres Gegenstück kann auf einen QSystemSemaphor von mehreren threads aus zugegriffen werden. Im Gegensatz zu QSemaphore kann auf eine QSystemSemaphore auch von mehreren processes aus zugegriffen werden. Das bedeutet, dass QSystemSemaphore eine viel schwerere Klasse ist. Wenn Ihre Anwendung also nicht über mehrere Prozesse hinweg auf Ihre Semaphore zugreifen muss, werden Sie wahrscheinlich QSemaphore verwenden wollen.

Semaphoren unterstützen zwei grundlegende Operationen, acquire() und release():

acquire() versucht, eine Ressource zu erhalten. Wenn keine Ressource verfügbar ist, blockiert der Aufruf, bis eine Ressource verfügbar wird. Dann wird die Ressource erworben und der Aufruf kehrt zurück.

release() gibt eine Ressource frei, damit sie von einem anderen Prozess angefordert werden kann. Die Funktion kann auch mit einem Parameter n > 1 aufgerufen werden, der n Ressourcen freigibt.

System-Semaphoren werden durch einen Schlüssel identifiziert, der durch QNativeIpcKey dargestellt wird. Ein Schlüssel kann plattformübergreifend mit platformSafeKey() erstellt werden. Ein System-Semaphor wird durch den QSystemSemaphore-Konstruktor erstellt, wenn ein Zugriffsmodus-Parameter von AccessMode::Create übergeben wird. Sobald er erstellt ist, können sich andere Prozesse an denselben Semaphor anhängen, indem sie denselben Schlüssel und einen AccessMode-Parameter von AccessMode::Open verwenden.

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 == 3

Details zu den Schlüsseltypen, plattformspezifischen Einschränkungen und der Interoperabilität mit älteren oder Nicht-Qt-Anwendungen finden Sie in der Dokumentation Native IPC Keys. Diese enthält wichtige Informationen für Sandbox-Anwendungen auf Apple-Plattformen, einschließlich aller Anwendungen, die über den Apple App Store bezogen werden.

Siehe auch Inter-Process Communication, QSharedMemory und QSemaphore.

Member-Typ-Dokumentation

enum QSystemSemaphore::AccessMode

Dieses Enum wird vom Konstruktor und setKey() verwendet. Sein Zweck ist es, das Problem in Unix-Implementierungen von Semaphoren, die einen Absturz überleben, zu lösen. Unter Unix, wenn eine Semaphore einen Absturz überlebt, brauchen wir eine Möglichkeit, sie zu zwingen, ihre Ressourcenanzahl zurückzusetzen, wenn das System die Semaphore wiederverwendet. Unter Windows, wo Semaphoren einen Absturz nicht überleben können, hat diese Aufzählung keine Wirkung.

KonstanteWertBeschreibung
QSystemSemaphore::Open0Wenn die Semaphore bereits existiert, wird ihre anfängliche Ressourcenzahl nicht zurückgesetzt. Wenn die Semaphore noch nicht existiert, wird sie erstellt und ihre anfängliche Ressourcenzahl gesetzt.
QSystemSemaphore::Create1QSystemSemaphore übernimmt das Eigentum an der Semaphore und setzt deren Ressourcenzahl auf den angeforderten Wert, unabhängig davon, ob die Semaphore bereits existiert, weil sie einen Absturz überlebt hat. Dieser Wert sollte an den Konstruktor übergeben werden, wenn der erste Semaphor für einen bestimmten Schlüssel erstellt wird und man weiß, dass, wenn der Semaphor bereits existiert, dies nur durch einen Absturz geschehen sein kann. Unter Windows, wo ein Semaphor einen Absturz nicht überleben kann, verhalten sich Create und Open gleich.

enum QSystemSemaphore::SystemSemaphoreError

KonstanteWertBeschreibung
QSystemSemaphore::NoError0Es ist kein Fehler aufgetreten.
QSystemSemaphore::PermissionDenied1Der Vorgang ist fehlgeschlagen, weil der Aufrufer nicht über die erforderlichen Berechtigungen verfügte.
QSystemSemaphore::KeyError2Der Vorgang ist wegen eines ungültigen Schlüssels fehlgeschlagen.
QSystemSemaphore::AlreadyExists3Der Vorgang schlug fehl, weil ein System-Semaphor mit dem angegebenen Schlüssel bereits vorhanden war.
QSystemSemaphore::NotFound4Der Vorgang ist fehlgeschlagen, weil ein System-Semaphor mit dem angegebenen Schlüssel nicht gefunden werden konnte.
QSystemSemaphore::OutOfResources5Der Vorgang ist fehlgeschlagen, weil nicht genügend Speicher für die Anforderung verfügbar war.
QSystemSemaphore::UnknownError6Es ist etwas anderes passiert und es war schlecht.

Dokumentation der Mitgliedsfunktionen

QSystemSemaphore::QSystemSemaphore(const QNativeIpcKey &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)

Fordert eine System-Semaphore für die angegebene key an. Die Parameter initialValue und mode werden nach den folgenden Regeln verwendet, die systemabhängig sind.

Unter Unix wird, wenn mode gleich Open ist und das System bereits über einen Semaphor verfügt, der durch key identifiziert wird, dieser Semaphor verwendet, und die Ressourcenzahl des Semaphors wird nicht geändert, d. h. initialValue wird ignoriert. Wenn das System jedoch noch keinen Semaphor mit der Kennung key hat, wird ein neuer Semaphor für diesen Schlüssel angelegt und seine Ressourcenzahl auf initialValue gesetzt.

Unter Unix wird, wenn mode Create ist und das System bereits über einen Semaphor mit der Kennung key verfügt, dieser Semaphor verwendet und seine Ressourcenzahl auf initialValue gesetzt. Wenn das System nicht bereits über einen Semaphor mit der Kennung key verfügt, wird ein neuer Semaphor für diesen Schlüssel erstellt und seine Ressourcenzahl auf initialValue gesetzt.

Unter Windows wird mode ignoriert, und das System versucht immer, einen Semaphor für den angegebenen key zu erstellen. Wenn das System noch nicht über einen Semaphor mit der Bezeichnung key verfügt, erstellt es den Semaphor und setzt seine Ressourcenzahl auf initialValue. Wenn das System jedoch bereits über einen Semaphor mit der Bezeichnung key verfügt, verwendet es diesen Semaphor und ignoriert initialValue.

Der Parameter mode wird nur in Unix-Systemen verwendet, um den Fall zu behandeln, daß ein Semaphor einen Prozeßabsturz überlebt. In diesem Fall erhält der nächste Prozess, der einen Semaphor mit demselben key zuweist, den Semaphor, der den Absturz überlebt hat, und sofern mode nicht Create ist, wird der Ressourcenzähler nicht auf initialValue zurückgesetzt, sondern behält den Anfangswert, der ihm vom abgestürzten Prozess gegeben wurde.

Siehe auch acquire() und key().

QSystemSemaphore::QSystemSemaphore(const QString &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)

Fordert einen System-Semaphor an, der durch den Legacy-Schlüssel key identifiziert wird.

[noexcept] QSystemSemaphore::~QSystemSemaphore()

Der Destruktor zerstört das Objekt QSystemSemaphore, aber der zugrunde liegende System-Semaphor wird nicht aus dem System entfernt, es sei denn, diese Instanz von QSystemSemaphore ist die letzte, die für diesen System-Semaphor existiert.

Zwei wichtige Nebeneffekte des Destruktors hängen vom System ab. Wenn unter Windows acquire() für diesen Semaphor aufgerufen wurde, aber nicht release(), wird release() nicht vom Destruktor aufgerufen, noch wird die Ressource freigegeben, wenn der Prozess normal beendet wird. Dies wäre ein Programmfehler, der zu einer Blockade eines anderen Prozesses führen könnte, der versucht, die gleiche Ressource zu erwerben. Unter Unix werden erworbene Ressourcen, die nicht freigegeben werden, bevor der Destruktor aufgerufen wird, automatisch freigegeben, wenn der Prozess beendet wird.

bool QSystemSemaphore::acquire()

Erwirbt eine der von dieser Semaphore bewachten Ressourcen, falls eine verfügbar ist, und gibt true zurück. Wenn alle Ressourcen, die von dieser Semaphore bewacht werden, bereits erworben wurden, blockiert der Aufruf, bis eine von ihnen von einem anderen Prozess oder Thread freigegeben wird, der eine Semaphore mit demselben Schlüssel besitzt.

Wenn false zurückgegeben wird, 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 wenn ja, welcher Fehler es war.

Siehe auch errorString().

QString QSystemSemaphore::errorString() const

Gibt eine Textbeschreibung des letzten aufgetretenen Fehlers zurück. Wenn error() ein error value zurückgibt, rufen Sie diese Funktion auf, um eine Textzeichenkette zu erhalten, die den Fehler beschreibt.

Siehe auch error().

QString QSystemSemaphore::key() const

Gibt den Legacy-Schlüssel zurück, der diesem System-Semaphor zugewiesen ist. Der Schlüssel ist der Name, unter dem der Semaphor von anderen Prozessen angesprochen werden kann.

Siehe auch setKey().

QNativeIpcKey QSystemSemaphore::nativeIpcKey() const

Gibt den Schlüssel zurück, der diesem System-Semaphor zugewiesen ist. Der Schlüssel ist der Name, unter dem der Semaphor von anderen Prozessen angesprochen werden kann.

Sie können den nativen Schlüssel verwenden, um auf System-Semaphoren zuzugreifen, die nicht von Qt erstellt wurden, oder um Nicht-Qt-Anwendungen Zugriff zu gewähren. Siehe Native IPC-Schlüssel für weitere Informationen.

Siehe auch setNativeKey().

bool QSystemSemaphore::release(int n = 1)

Gibt n Ressourcen frei, die von der Semaphore bewacht werden. Gibt true zurück, es sei denn, es liegt ein Systemfehler vor.

Beispiel: Erzeugen eines System-Semaphors mit fünf Ressourcen; Erfassen aller Ressourcen und anschließendes Freigeben aller Ressourcen.

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 resources

Diese Funktion kann auch Ressourcen "erzeugen". Fügen Sie zum Beispiel unmittelbar nach der obigen Anweisungsfolge die Anweisung ein:

sem.release(10);          // "create" 10 new resources

Zehn neue Ressourcen werden nun von dem Semaphor bewacht, zusätzlich zu den fünf, die bereits vorhanden waren. Normalerweise würden Sie diese Funktion nicht verwenden, um weitere Ressourcen zu erzeugen.

Siehe auch acquire().

void QSystemSemaphore::setKey(const QString &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)

Diese Funktion funktioniert genauso wie der Konstruktor. Sie rekonstruiert dieses QSystemSemaphore Objekt. Wenn sich der neue key vom alten Schlüssel unterscheidet, ist der Aufruf dieser Funktion gleichbedeutend mit dem Aufruf des Destruktors des Semaphors mit dem alten Schlüssel und dem anschließenden 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.

Siehe auch QSystemSemaphore() und key().

void QSystemSemaphore::setNativeKey(const QNativeIpcKey &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)

Diese Funktion funktioniert genauso wie der Konstruktor. Sie rekonstruiert dieses QSystemSemaphore Objekt. Wenn sich der neue key vom alten Schlüssel unterscheidet, ist der Aufruf dieser Funktion gleichbedeutend mit dem Aufruf des Destruktors des Semaphors mit dem alten Schlüssel und dem anschließenden 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 freigegeben wurde. Siehe Native IPC-Schlüssel für weitere Informationen.

Siehe auch QSystemSemaphore() und nativeIpcKey().

© 2025 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.