![]() |
Qt 6.x
The Qt SDK
|
\inmodule QtCore More...
#include <qsemaphore.h>
Collaboration diagram for QSemaphore:Public Member Functions | |
| QSemaphore (int n=0) | |
| Creates a new semaphore and initializes the number of resources it guards to n (by default, 0). | |
| ~QSemaphore () | |
| Destroys the semaphore. | |
| void | acquire (int n=1) |
Tries to acquire n resources guarded by the semaphore. | |
| bool | tryAcquire (int n=1) |
Tries to acquire n resources guarded by the semaphore and returns true on success. | |
| bool | tryAcquire (int n, int timeout) |
Tries to acquire n resources guarded by the semaphore and returns true on success. | |
| bool | tryAcquire (int n, QDeadlineTimer timeout) |
| void | release (int n=1) |
| Releases n resources guarded by the semaphore. | |
| int | available () const |
| Returns the number of resources currently available to the semaphore. | |
| bool | try_acquire () noexcept |
| template<typename Rep , typename Period > | |
| bool | try_acquire_for (const std::chrono::duration< Rep, Period > &timeout) |
| template<typename Clock , typename Duration > | |
| bool | try_acquire_until (const std::chrono::time_point< Clock, Duration > &tp) |
\inmodule QtCore
The QSemaphore class provides a general counting semaphore.
\threadsafe
A semaphore is a generalization of a mutex. While a mutex can only be locked once, it's possible to acquire a semaphore multiple times. Semaphores are typically used to protect a certain number of identical resources.
Semaphores support two fundamental operations, acquire() and release():
\list
There's also a tryAcquire() function that returns immediately if it cannot acquire the resources, and an available() function that returns the number of available resources at any time.
Example:
A typical application of semaphores is for controlling access to a circular buffer shared by a producer thread and a consumer thread. The \l{Semaphores Example} shows how to use QSemaphore to solve that problem.
A non-computing example of a semaphore would be dining at a restaurant. A semaphore is initialized with the number of chairs in the restaurant. As people arrive, they want a seat. As seats are filled, available() is decremented. As people leave, the available() is incremented, allowing more people to enter. If a party of 10 people want to be seated, but there are only 9 seats, those 10 people will wait, but a party of 4 people would be seated (taking the available seats to 5, making the party of 10 people wait longer).
Definition at line 15 of file qsemaphore.h.
|
explicit |
Creates a new semaphore and initializes the number of resources it guards to n (by default, 0).
Definition at line 284 of file qsemaphore.cpp.
References d, QtFreeBSDFutex::futexAvailable(), futexHasWaiterCount, Q_ASSERT_X, QBasicAtomicInteger< T >::storeRelaxed(), and u.
Here is the call graph for this function:| QSemaphore::~QSemaphore | ( | ) |
Destroys the semaphore.
Definition at line 303 of file qsemaphore.cpp.
References d, and QtFreeBSDFutex::futexAvailable().
Here is the call graph for this function:| void QSemaphore::acquire | ( | int | n = 1 | ) |
Tries to acquire n resources guarded by the semaphore.
If n
available(), this call will block until enough resources are
available.
Definition at line 316 of file qsemaphore.cpp.
References d, QDeadlineTimer::Forever, QtFreeBSDFutex::futexAvailable(), futexSemaphoreTryAcquire(), Q_ASSERT_X, and u.
Referenced by ActiveCamera::~ActiveCamera(), QImage::applyColorTransform(), convert_generic(), convert_generic_inplace(), convert_generic_inplace_over_rgb64(), convert_generic_over_rgb64(), doActivate(), QMetaMethodInvoker::invokeImpl(), multithread_pixels_function(), QAndroidEventDispatcher::processEvents(), QLibProxyWrapper::run(), org.qtproject.qt.android.QtThread::run(), ActiveCamera::setFormat(), and QtConcurrent::ThreadEngineBarrier::wait().
Here is the call graph for this function:
Here is the caller graph for this function:| int QSemaphore::available | ( | ) | const |
Returns the number of resources currently available to the semaphore.
This number can never be negative.
Definition at line 414 of file qsemaphore.cpp.
References d, QtFreeBSDFutex::futexAvailable(), futexAvailCounter(), QBasicAtomicInteger< T >::loadRelaxed(), and u.
Here is the call graph for this function:| void QSemaphore::release | ( | int | n = 1 | ) |
Releases n resources guarded by the semaphore.
This function can be used to "create" resources as well. For example:
QSemaphoreReleaser is a \l{http://en.cppreference.com/w/cpp/language/raii}{RAII} wrapper around this function.
Definition at line 350 of file qsemaphore.cpp.
References d, QtFreeBSDFutex::futexAvailable(), futexHasWaiterCount, futexHigh32(), futexLow32(), futexNeedsWake(), futexNeedsWakeAllBit, QtFreeBSDFutex::futexWakeAll(), QBasicAtomicInteger< T >::loadRelaxed(), Q_ASSERT_X, QBasicAtomicInteger< T >::testAndSetRelease(), and u.
Referenced by QLibProxyWrapper::~QLibProxyWrapper(), QSemaphoreReleaser::~QSemaphoreReleaser(), QImage::applyColorTransform(), convert_generic(), convert_generic_inplace(), convert_generic_inplace_over_rgb64(), convert_generic_over_rgb64(), QLibProxyWrapper::getProxies(), multithread_pixels_function(), ActiveCamera::onFlush(), QtConcurrent::ThreadEngineBarrier::release(), org.qtproject.qt.android.QtThread::run(), and QAndroidEventDispatcher::start().
Here is the call graph for this function:
Here is the caller graph for this function:
|
inlinenoexcept |
This function is provided for {std::counting_semaphore} compatibility.
It is equivalent to calling {tryAcquire(1)}, where the function returns true on acquiring the resource successfully.
Definition at line 37 of file qsemaphore.h.
References tryAcquire().
Here is the call graph for this function:
|
inline |
This function is provided for {std::counting_semaphore} compatibility.
It is equivalent to calling {tryAcquire(1, timeout)}, where the call times out on the given timeout value. The function returns true on acquiring the resource successfully.
Definition at line 39 of file qsemaphore.h.
References tryAcquire().
Here is the call graph for this function:
|
inline |
This function is provided for {std::counting_semaphore} compatibility.
It is equivalent to calling {tryAcquire(1, tp - Clock::now())}, which means that the tp (time point) is recorded, ignoring the adjustments to {Clock} while waiting. The function returns true on acquiring the resource successfully.
Definition at line 42 of file qsemaphore.h.
| QSemaphore::tryAcquire | ( | int | n, |
| int | timeout | ||
| ) |
Tries to acquire n resources guarded by the semaphore and returns true on success.
If available() < n, this call will wait for at most timeout milliseconds for resources to become available.
Note: Passing a negative number as the timeout is equivalent to calling acquire(), i.e. this function will wait forever for resources to become available if timeout is negative.
Example:
References tryAcquire().
Here is the call graph for this function:| bool QSemaphore::tryAcquire | ( | int | n, |
| QDeadlineTimer | timer | ||
| ) |
Tries to acquire n resources guarded by the semaphore and returns true on success. If available() < n, this call will wait until timer expires for resources to become available.
Example:
Definition at line 480 of file qsemaphore.cpp.
References acquire(), d, QtFreeBSDFutex::futexAvailable(), futexSemaphoreTryAcquire(), Q_ASSERT_X, timer, tryAcquire(), and u.
Here is the call graph for this function:| bool QSemaphore::tryAcquire | ( | int | n = 1 | ) |
Tries to acquire n resources guarded by the semaphore and returns true on success.
If available() < n, this call immediately returns false without acquiring any resources.
Example:
Definition at line 434 of file qsemaphore.cpp.
References d, Expired, QtFreeBSDFutex::futexAvailable(), futexSemaphoreTryAcquire(), Q_ASSERT_X, and u.
Referenced by tryAcquire().
Here is the call graph for this function:
Here is the caller graph for this function:| QSemaphorePrivate* QSemaphore::d |
Definition at line 50 of file qsemaphore.h.
Referenced by QSemaphore(), ~QSemaphore(), acquire(), available(), release(), tryAcquire(), and tryAcquire().
| QBasicAtomicInteger<quintptr> QSemaphore::u |
Definition at line 51 of file qsemaphore.h.
Referenced by QSemaphore(), acquire(), available(), release(), tryAcquire(), and tryAcquire().
| QBasicAtomicInteger<quint32> QSemaphore::u32[2] |
Definition at line 52 of file qsemaphore.h.
| QBasicAtomicInteger<quint64> QSemaphore::u64 |
Definition at line 53 of file qsemaphore.h.