이 페이지에서

QSemaphore Class

QSemaphore 클래스는 일반적인 카운팅 세마포어를 제공합니다. 더 보기...

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

참고: 이 클래스의 모든 함수는 스레드 안전합니다.

공개 함수

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)

상세 설명

세마포어는 뮤텍스의 일반화된 형태입니다. 뮤텍스는 한 번만 잠글 수 있는 반면, 세마포어는 여러 번 획득할 수 있습니다. 세마포어는 일반적으로 특정 수의 동일한 리소스를 보호하는 데 사용됩니다.

세마포어는 두 가지 기본 연산인 ` acquire()`와 ` release()`를 지원합니다.

  • acquire(n)은 n개의 리소스를 확보하려고 시도합니다. 사용 가능한 리소스가 그 수만큼 충분하지 않은 경우, 해당 조건이 충족될 때까지 호출이 차단됩니다.
  • release(n)은 n개의 자원을 해제합니다.

또한, 리소스를 확보할 수 없는 경우 즉시 반환하는 tryAcquire() 함수와, 언제든지 사용 가능한 리소스의 수를 반환하는 available() 함수도 있습니다.

예시:

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

세마포어의 대표적인 응용 사례는 프로듀서 스레드와 컨슈머 스레드가 공유하는 순환 버퍼에 대한 접근을 제어하는 것입니다. ‘세마포어를 사용하는 프로듀서 및 컨슈머’ 예제에서는 QSemaphore를 사용하여 이 문제를 해결하는 방법을 보여줍니다.

컴퓨팅 분야 외의 세마포어 예시로는 식당에서 식사하는 상황을 들 수 있습니다. 세마포어는 식당의 의자 수로 초기화됩니다. 사람들이 도착하면 자리를 원합니다. 자리가 채워질 때마다 ` available()`가 감소합니다. 사람들이 떠날 때마다 ` available()`가 증가하여 더 많은 사람이 들어올 수 있게 됩니다. 만약 10명이 자리를 원하지만 의자가 9개밖에 없다면, 그 10명은 기다려야 하지만 4명 일행은 자리에 앉을 수 있습니다(이 경우 사용 가능한 의자 수가 5개가 되어 10명 일행은 더 오래 기다려야 합니다).

관련 항목: QSemaphoreReleaser, QMutex, QWaitCondition, QThread, 세마포어를 사용한 프로듀서 및 컨슈머.

멤버 함수 문서

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

새로운 세마포어를 생성하고, 이 세마포어가 관리하는 리소스 수를 n 로 초기화합니다(기본값은 0입니다).

release() 및 available()도 참조하십시오 .

[noexcept] QSemaphore::~QSemaphore()

세마포어를 삭제합니다.

경고: 사용 중인 세마포어를해제하면 정의되지 않은 동작이 발생할 수 있습니다.

void QSemaphore::acquire(int n = 1)

세마포어로 보호되는 n 리소스를 확보하려고 시도합니다. n > available()인 경우, 이 호출은 충분한 리소스가 확보될 때까지 차단됩니다.

release(), available(), tryAcquire()도 참조하십시오 .

int QSemaphore::available() const

세마포어가 현재 사용할 수 있는 리소스의 수를 반환합니다. 이 수는 절대 음수가 될 수 없습니다.

acquire() 및 release()도 참조하십시오 .

void QSemaphore::release(int n = 1)

세마포어로 보호되고 있는 n 리소스를 해제합니다.

이 함수는 리소스를 "생성"하는 데에도 사용할 수 있습니다. 예를 들어:

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 는 이 함수를 감싼 RAII 래퍼입니다.

acquire(), available(), QSemaphoreReleaser도 참조하십시오 .

bool QSemaphore::tryAcquire(int n = 1)

세마포어가 보호하는 n 리소스를 확보하려고 시도하며, 성공 시 true 를 반환합니다. available() < n 인 경우, 이 호출은 리소스를 확보하지 않은 채 즉시 false 를 반환합니다.

예시:

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

acquire()도 참조하십시오 .

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

세마포어로 보호되는 n 리소스를 확보하려고 시도하며, 성공 시 true 를 반환합니다. available() < n 인 경우, 이 호출은 timer 가 만료되어 리소스를 사용할 수 있게 될 때까지 대기합니다.

예시:

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

이 함수는 Qt 6.6에서 도입되었습니다.

acquire()도 참조하십시오 .

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

세마포어로 보호되는 n 리소스를 확보하려고 시도하며, 성공 시 true 을 반환합니다. 만약 available() < n 인 경우, 이 호출은 리소스가 사용 가능해질 때까지 최대 timeout 밀리초 동안 대기합니다.

참고: ` timeout ` 매개변수로 음수를 전달하는 것은 ` acquire()`를 호출하는 것과 동일합니다. 즉, ` timeout `가 음수인 경우 이 함수는 리소스가 사용 가능해질 때까지 무한정 대기합니다.

예:

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

acquire()도 참조하십시오 .

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

이 함수는 오버로드된 함수입니다.

이 함수는 Qt 6.3에서 도입되었습니다.

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

이 함수는 std::counting_semaphore 과의 호환성을 위해 제공됩니다.

이는 tryAcquire(1) 를 호출하는 것과 동일하며, 리소스를 성공적으로 획득하면 이 함수는 true 을 반환합니다.

이 함수는 Qt 6.3에서 도입되었습니다.

tryAcquire(), try_acquire_for(), try_acquire_until()도 참조하십시오 .

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

이 함수는 std::counting_semaphore 과의 호환성을 위해 제공됩니다.

이는 tryAcquire(1, timeout) 를 호출하는 것과 동일하며, 지정된 timeout 값에 따라 호출이 타임아웃됩니다. 이 함수는 리소스를 성공적으로 확보하면 true 를 반환합니다.

이 함수는 Qt 6.3에서 도입되었습니다.

tryAcquire(), try_acquire(), try_acquire_until()도 참조하십시오 .

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

이 함수는 std::counting_semaphore 와의 호환성을 위해 제공됩니다.

이는 ` tryAcquire(1, tp - Clock::now())`를 호출하는 것과 동일하며, 대기 중 ` Clock `에 대한 조정을 무시하고 ` tp `(시간점)이 기록됨을 의미합니다. 이 함수는 리소스를 성공적으로 확보하면 ` true `를 반환합니다.

이 함수는 Qt 6.3에서 도입되었습니다.

tryAcquire(), try_acquire(), 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.