Auf dieser Seite

QSemaphore Class

Die Klasse „QSemaphore“ stellt ein allgemeines Zählsemaphor bereit. Mehr...

Header: #include <QSemaphore>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

Hinweis: Alle Funktionen dieser Klasse sind threadsicher.

Öffentliche Funktionen

QSemaphore(int n = 0)
~QSemaphore()
void acquire(int n = 1)
int available() const
void release(int n = 1)
bool tryAcquire(int n = 1)
(since 6.6) bool tryAcquire(int n, QDeadlineTimer timer)
bool tryAcquire(int n, int timeout)
(since 6.3) bool tryAcquire(int n, std::chrono::duration<Rep, Period> timeout)
(since 6.3) bool try_acquire()
(since 6.3) bool try_acquire_for(const std::chrono::duration<Rep, Period> &timeout)
(since 6.3) bool try_acquire_until(const std::chrono::time_point<Clock, Duration> &tp)

Ausführliche Beschreibung

Ein Semaphor ist eine Verallgemeinerung eines Mutex. Während ein Mutex nur einmal gesperrt werden kann, ist es möglich, einen Semaphor mehrfach zu erwerben. Semaphore werden typischerweise verwendet, um eine bestimmte Anzahl identischer Ressourcen zu schützen.

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

  • acquire(n) versucht, n Ressourcen zu erwerben. Sind nicht genügend Ressourcen verfügbar, wird der Aufruf so lange blockiert, bis dies der Fall ist.
  • `release(n)` gibt n Ressourcen frei.

Außerdem gibt es eine Funktion ` tryAcquire()`, die sofort zurückkehrt, wenn die Ressourcen nicht erworben werden können, sowie eine Funktion ` available()`, die jederzeit die Anzahl der verfügbaren Ressourcen zurückgibt.

Beispiel:

QSemaphore sem(5);      // sem.available() == 5

sem.acquire(3);         // sem.available() == 2
sem.acquire(2);         // sem.available() == 0
sem.release(5);         // sem.available() == 5
sem.release(5);         // sem.available() == 10

sem.tryAcquire(1);      // sem.available() == 9, returns true
sem.tryAcquire(250);    // sem.available() == 9, returns false

Eine typische Anwendung von Semaphoren ist die Steuerung des Zugriffs auf einen Ringpuffer, der von einem Produzenten-Thread und einem Konsumenten-Thread gemeinsam genutzt wird. Das Beispiel „Produzent und Konsument mit Semaphoren“ zeigt, wie man QSemaphore zur Lösung dieses Problems einsetzt.

Ein Beispiel für einen Semaphor außerhalb der Informatik wäre das Essen in einem Restaurant. Ein Semaphor wird mit der Anzahl der Stühle im Restaurant initialisiert. Wenn Gäste eintreffen, möchten sie einen Platz. Sobald Plätze besetzt werden, wird ` available()` dekrementiert. Wenn Gäste das Restaurant verlassen, wird ` available()` inkrementiert, sodass weitere Gäste eintreten können. Wenn eine Gruppe von 10 Personen einen Platz haben möchte, aber nur 9 Plätze verfügbar sind, müssen diese 10 Personen warten, während eine Gruppe von 4 Personen Platz nehmen kann (wodurch die Anzahl der verfügbaren Plätze auf 5 sinkt und die Gruppe der 10 Personen länger warten muss).

Siehe auch „ QSemaphoreReleaser“ , „ QMutex “, „ QWaitCondition “, „ QThread “ sowie „Producer und Consumer mit Semaphoren“.

Dokumentation der Member-Funktionen

[explicit] QSemaphore::QSemaphore(int n = 0)

Erstellt ein neues Semaphor und initialisiert die Anzahl der Ressourcen, die es verwaltet, auf n (standardmäßig 0).

Siehe auch „ release()“ und „ available()“.

[noexcept] QSemaphore::~QSemaphore()

Löscht das Semaphor.

Warnung: Das Löschen eines Semaphors, der gerade verwendet wird, kann zu undefiniertem Verhalten führen.

void QSemaphore::acquire(int n = 1)

Versucht, die durch das Semaphor geschützten Ressourcen von n zu beziehen. Wenn n > available(), wird dieser Aufruf so lange blockiert, bis genügend Ressourcen verfügbar sind.

Siehe auch release(), available() und tryAcquire().

int QSemaphore::available() const

Gibt die Anzahl der Ressourcen zurück, die dem Semaphor derzeit zur Verfügung stehen. Diese Zahl kann niemals negativ sein.

Siehe auch „ acquire()“ und „ release()“.

void QSemaphore::release(int n = 1)

Gibt die durch das Semaphor geschützten Ressourcen „ n “ frei.

Diese Funktion kann auch zum „Erstellen“ von Ressourcen verwendet werden. Beispiel:

QSemaphore sem(5);      // a semaphore that guards 5 resources
sem.acquire(5);         // acquire all 5 resources
sem.release(5);         // release the 5 resources
sem.release(10);        // "create" 10 new resources

QSemaphoreReleaser ist ein RAII -Wrapper um diese Funktion.

Siehe auch acquire(), available() und QSemaphoreReleaser.

bool QSemaphore::tryAcquire(int n = 1)

Versucht, die durch das Semaphor geschützten Ressourcen „ n “ zu erwerben, und gibt bei Erfolg „ true “ zurück. Wenn „ available() < n “ gilt, gibt dieser Aufruf sofort „ false “ zurück, ohne Ressourcen zu erwerben.

Beispiel:

QSemaphore sem(5);      // sem.available() == 5
sem.tryAcquire(250);    // sem.available() == 5, returns false
sem.tryAcquire(3);      // sem.available() == 2, returns true

Siehe auch ` acquire()`.

[since 6.6] bool QSemaphore::tryAcquire(int n, QDeadlineTimer timer)

Versucht, die durch das Semaphor geschützten Ressourcen von n zu erwerben, und gibt bei Erfolg true zurück. Wenn available() < n ist, wartet dieser Aufruf, bis timer abläuft, damit Ressourcen verfügbar werden.

Beispiel:

QSemaphore sem(5);                          // sem.available() == 5
sem.tryAcquire(250, QDeadlineTimer(1000));  // sem.available() == 5, waits 1000 milliseconds and returns false
sem.tryAcquire(3, QDeadlineTimer(30s));     // sem.available() == 2, returns true without waiting

Diese Funktion wurde in Qt 6.6 eingeführt.

Siehe auch ` acquire()`.

bool QSemaphore::tryAcquire(int n, int timeout)

Versucht, die durch das Semaphor geschützten Ressourcen „ n “ zu beziehen, und gibt bei Erfolg „ true “ zurück. Wenn „ available() < n “ gilt, wartet dieser Aufruf höchstens „ timeout “ Millisekunden darauf, dass Ressourcen verfügbar werden.

Hinweis: Die Übergabe einer negativen Zahl als „ timeout “ entspricht dem Aufruf von ` acquire()`, d. h., diese Funktion wartet unendlich lange darauf, dass Ressourcen verfügbar werden, wenn ` timeout ` negativ ist.

Beispiel:

QSemaphore sem(5);            // sem.available() == 5
sem.tryAcquire(250, 1000);    // sem.available() == 5, waits 1000 milliseconds and returns false
sem.tryAcquire(3, 30000);     // sem.available() == 2, returns true without waiting

Siehe auch ` acquire()`.

[since 6.3] template <typename Rep, typename Period> bool QSemaphore::tryAcquire(int n, std::chrono::duration<Rep, Period> timeout)

Dies ist eine überladene Funktion.

Diese Funktion wurde in Qt 6.3 eingeführt.

[noexcept, since 6.3] bool QSemaphore::try_acquire()

Diese Funktion wird aus Gründen der Kompatibilität mit „ std::counting_semaphore “ bereitgestellt.

Sie entspricht dem Aufruf von ` tryAcquire(1)`, wobei die Funktion bei erfolgreicher Erlangung der Ressource ` true ` zurückgibt.

Diese Funktion wurde in Qt 6.3 eingeführt.

Siehe auch „ tryAcquire()“, „ try_acquire_for()“ und „ try_acquire_until()“.

[since 6.3] template <typename Rep, typename Period> bool QSemaphore::try_acquire_for(const std::chrono::duration<Rep, Period> &timeout)

Diese Funktion wird aus Gründen der Kompatibilität mit „ std::counting_semaphore “ bereitgestellt.

Sie entspricht dem Aufruf von ` tryAcquire(1, timeout)`, wobei der Aufruf bei Erreichen des angegebenen Werts für ` timeout ` abbricht. Die Funktion gibt ` true ` zurück, wenn die Ressource erfolgreich angefordert wurde.

Diese Funktion wurde in Qt 6.3 eingeführt.

Siehe auch ` tryAcquire()`, ` try_acquire()` und ` try_acquire_until()`.

[since 6.3] template <typename Clock, typename Duration> bool QSemaphore::try_acquire_until(const std::chrono::time_point<Clock, Duration> &tp)

Diese Funktion wird zur Kompatibilität mit „ std::counting_semaphore “ bereitgestellt.

Sie entspricht dem Aufruf von ` tryAcquire(1, tp - Clock::now())`, was bedeutet, dass der Zeitpunkt ` tp ` aufgezeichnet wird, wobei die Anpassungen an ` Clock ` während des Wartens ignoriert werden. Die Funktion gibt ` true ` zurück, wenn die Ressource erfolgreich angefordert wurde.

Diese Funktion wurde in Qt 6.3 eingeführt.

Siehe auch „ tryAcquire()“, „ try_acquire()“ und „ try_acquire_for()“.

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