이 페이지에서

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를 생성하면 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는 이동(move)이 가능하므로, 함수에서 반환하여 세마포어 해제 책임을 함수나 범위 밖으로 이전할 수 있습니다:

{ // 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 default] 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()

이 QSemaphoreReleaser 를 취소하여 소멸자가 더 이상 semaphore()->release() 를 호출하지 않도록 합니다. 이 호출 전의 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)

*this 와 other 의 역할을 서로 바꿉니다.

move 할당과 달리, 두 객체 중 어느 쪽도 스왑의 결과로 세마포어(있는 경우)를 해제하지 않습니다.

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

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

할당 연산자를 이동합니다. other 에서 QSemaphore::release()을 호출하는 역할을 인수하며, 이에 따라 해당 호출은 취소됩니다.

이 세마포어 해제자가 QSemaphore::release()을 직접 호출해야 할 책임이 있는 경우, other 에서 책임을 인계받기 전에 해당 호출을 수행합니다.

cancel()도 참조하십시오 .

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