QSemaphoreReleaser 類提供異常安全延遲為 QSemaphore::release () 調用。 更多...
| 頭: | #include <QSemaphoreReleaser> |
| qmake: | QT += core |
| Since: | Qt 5.10 |
該類在 Qt 5.10 引入。
注意: 此類的所有函數 可重入 .
| QSemaphoreReleaser (QSemaphoreReleaser && other ) | |
| QSemaphoreReleaser (QSemaphore * sem , int n = 1) | |
| QSemaphoreReleaser (QSemaphore & sem , int n = 1) | |
| QSemaphoreReleaser () | |
| QSemaphoreReleaser & | operator= (QSemaphoreReleaser && other ) |
| ~QSemaphoreReleaser () | |
| QSemaphore * | cancel () |
| QSemaphore * | semaphore () const |
| void | swap (QSemaphoreReleaser & other ) |
QSemaphoreReleaser can be used wherever you would otherwise use QSemaphore::release (). Constructing a QSemaphoreReleaser defers the release() call on the semaphore until the QSemaphoreReleaser is destroyed (see RAII pattern ).
You can use this to reliably release a semaphore to avoid dead-lock in the face of exceptions or early returns:
// ... do something that may throw or return early sem.release();
If an early return is taken or an exception is thrown before the
sem.release()
call is reached, the semaphore is not released, possibly preventing the thread waiting in the corresponding
sem.acquire()
call from ever continuing execution.
When using RAII instead:
const QSemaphoreReleaser releaser(sem); // ... do something that may throw or early return // implicitly calls sem.release() here and at every other return in between
this can no longer happen, because the compiler will make sure that the QSemaphoreReleaser destructor is always called, and therefore the semaphore is always released.
QSemaphoreReleaser is move-enabled and can therefore be returned from functions to transfer responsibility for releasing a semaphore out of a function or a scope:
{ // some scope
QSemaphoreReleaser releaser; // does nothing
// ...
if (someCondition) {
releaser = QSemaphoreReleaser(sem);
// ...
}
// ...
} // conditionally calls sem.release(), depending on someCondition
A QSemaphoreReleaser can be canceled by a call to cancel (). A canceled semaphore releaser will no longer call QSemaphore::release () in its destructor.
另請參閱 QMutexLocker .
Move constructor. Takes over responsibility to call QSemaphore::release () 從 other , which in turn is canceled.
另請參閱 cancel ().
Constructor. Stores the arguments and calls sem ->release( n ) in the destructor.
Constructor. Stores the arguments and calls sem .release( n ) in the destructor.
Default constructor. Creates a QSemaphoreReleaser that does nothing.
Move assignment operator. Takes over responsibility to call QSemaphore::release () 從 other , which in turn is canceled.
If this semaphore releaser had the responsibility to call some QSemaphore::release () itself, it performs the call before taking over from other .
另請參閱 cancel ().
Unless canceled, calls QSemaphore::release () with the arguments provided to the constructor, or by the last move assignment.
Cancels this
QSemaphoreReleaser
such that the destructor will no longer call
semaphore()->release()
. Returns the value of
semaphore
() before this call. After this call,
semaphore
() 會返迴
nullptr
.
To enable again, assign a new QSemaphoreReleaser :
releaser.cancel(); // avoid releasing old semaphore() releaser = QSemaphoreReleaser(sem, 42); // now will call sem.release(42) when 'releaser' is destroyed
返迴指針指嚮
QSemaphore
object provided to the constructor, or by the last move assignment, if any. Otherwise, returns
nullptr
.
Exchanges the responsibilities of
*this
and
other
.
Unlike move assignment, neither of the two objects ever releases its semaphore, if any, as a consequence of swapping.
Therefore this function is very fast and never fails.