QSemaphore Class
QSemaphore 클래스는 일반 계수 세마포어를 제공합니다. 더 보기...
Header: | #include <QSemaphore> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- 상속된 멤버를 포함한 모든 멤버 목록
- Q세마포어는 스레딩 클래스의 일부입니다.
참고: 이 클래스의 모든 함수는 스레드 안전합니다.
공용 함수
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명의 일행이 더 오래 대기하게 됩니다(사용 가능한 좌석이 5석으로 줄어듭니다).
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
호환성을 위해 제공됩니다.
주어진 timeout 값에서 호출 시간이 초과되는 tryAcquire(1, 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()도 참조하십시오 .
© 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.