QSemaphoreReleaser Class

QSemaphoreReleaser 클래스는 QSemaphore::release() 호출의 예외 안전 지연을 제공합니다. 더 보기...

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

참고: 이 클래스의 모든 함수는 재진입합니다.

공용 함수

QSemaphoreReleaser()
QSemaphoreReleaser(QSemaphore &sem, int n = 1)
QSemaphoreReleaser(QSemaphore *sem, int n = 1)
QSemaphoreReleaser(QSemaphoreReleaser &&other)
~QSemaphoreReleaser()
QSemaphore *cancel()
QSemaphore *semaphore() const
void swap(QSemaphoreReleaser &other)
QSemaphoreReleaser &operator=(QSemaphoreReleaser &&other)

상세 설명

QSemaphoreReleaser는 QSemaphore::release()를 사용하는 모든 곳에서 사용할 수 있습니다. QSemaphoreReleaser를 생성하면 세마포어가 소멸될 때까지 세마포어의 release() 호출이 연기됩니다( RAII 패턴 참조).

이를 사용하면 예외나 조기 반환이 발생했을 때 교착 상태를 피하기 위해 세마포어를 안정적으로 해제할 수 있습니다:

// ... do something that may throw or return early
sem.release();

sem.release() 호출에 도달하기 전에 조기 반환이 발생하거나 예외가 발생하면 세마포어가 해제되지 않아 해당 sem.acquire() 호출에서 대기 중인 스레드가 실행을 계속하지 못할 수 있습니다.

대신 RAII를 사용하면

const QSemaphoreReleaser releaser(sem);
// ... do something that may throw or early return
// implicitly calls sem.release() here and at every other return in between

컴파일러가 QSemaphoreReleaser 소멸자가 항상 호출되고 따라서 세마포어가 항상 해제되도록 하기 때문에 더 이상 이런 일이 발생하지 않습니다.

QSemaphoreReleaser는 이동이 가능하므로 함수에서 반환되어 함수나 스코프에서 세마포어를 해제하는 책임을 이전할 수 있습니다:

{ // some scope
    QSemaphoreReleaser releaser; // does nothing
    // ...
    if (someCondition) {
        releaser = QSemaphoreReleaser(sem);
        // ...
    }
    // ...
} // conditionally calls sem.release(), depending on someCondition

cancel() 호출로 QSemaphoreReleaser를 취소할 수 있습니다. 취소된 세마포어 릴리저는 더 이상 소멸자에서 QSemaphore::release()를 호출하지 않습니다.

QMutexLocker도 참조하십시오 .

멤버 함수 문서

[constexpr noexcept] QSemaphoreReleaser::QSemaphoreReleaser()

기본 생성자. 아무 작업도 하지 않는 QSemaphoreReleaser를 생성합니다.

[explicit noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore &sem, int n = 1)

생성자를 생성합니다. 인수를 저장하고 소멸자에서 sem.release(n)를 호출합니다.

[explicit noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphore *sem, int n = 1)

생성자. 인자를 저장하고 소멸자에서 sem->release(n)를 호출합니다.

[noexcept] QSemaphoreReleaser::QSemaphoreReleaser(QSemaphoreReleaser &&other)

생성자를 이동합니다. other 에서 QSemaphore::release()를 호출할 책임을 넘겨받습니다.

cancel()도 참조하세요 .

[noexcept] QSemaphoreReleaser::~QSemaphoreReleaser()

취소하지 않는 한, 생성자에 제공된 인수 또는 마지막 이동 할당을 통해 QSemaphore::release()를 호출합니다.

[noexcept] QSemaphore *QSemaphoreReleaser::cancel()

소멸자가 더 이상 semaphore()->release() 을 호출하지 않도록 QSemaphoreReleaser 을 취소합니다. 이 호출 전에는 semaphore() 값을 반환합니다. 이 호출 이후 semaphore()는 nullptr 을 반환합니다.

다시 활성화하려면 새 QSemaphoreReleaser 을 할당합니다:

releaser.cancel(); // avoid releasing old semaphore()
releaser = QSemaphoreReleaser(sem, 42);
// now will call sem.release(42) when 'releaser' is destroyed

[noexcept] QSemaphore *QSemaphoreReleaser::semaphore() const

생성자에 제공된 QSemaphore 객체에 대한 포인터를 반환하거나 마지막 이동 할당이 있는 경우 반환합니다. 그렇지 않으면 nullptr 을 반환합니다.

[noexcept] void QSemaphoreReleaser::swap(QSemaphoreReleaser &other)

*thisother 의 책임을 교환합니다.

이동 할당과 달리 두 객체 중 어느 것도 스와핑의 결과로 세마포어를 해제하지 않습니다.

따라서 이 함수는 매우 빠르며 절대 실패하지 않습니다.

[noexcept] QSemaphoreReleaser &QSemaphoreReleaser::operator=(QSemaphoreReleaser &&other)

할당 연산자를 이동합니다. other 에서 QSemaphore::release() 호출에 대한 책임을 넘겨받아 취소합니다.

이 세마포어 릴리스자가 QSemaphore::release() 자체를 호출할 책임이 있는 경우 other 에서 인계받기 전에 호출을 수행합니다.

cancel()도 참조하세요 .

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