이 페이지에서

QSystemSemaphore Class

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

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

공개 타입

enum AccessMode { Open, Create }
enum SystemSemaphoreError { NoError, PermissionDenied, KeyError, AlreadyExists, NotFound, …, UnknownError }

공개 함수

QSystemSemaphore(const QNativeIpcKey &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)
QSystemSemaphore(const QString &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)
~QSystemSemaphore()
bool acquire()
QSystemSemaphore::SystemSemaphoreError error() const
QString errorString() const
QString key() const
QNativeIpcKey nativeIpcKey() const
bool release(int n = 1)
void setKey(const QString &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)
void setNativeKey(const QNativeIpcKey &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)

상세 설명

시스템 세마포어는 QSemaphore 의 일반화된 형태입니다. 일반적으로 세마포어는 특정 수의 동일한 리소스를 보호하는 데 사용됩니다.

더 가벼운 대응 클래스와 마찬가지로, QSystemSemaphore는 여러 threads 에서 액세스할 수 있습니다. QSemaphore 와 달리, QSystemSemaphore는 여러 processes 에서도 액세스할 수 있습니다. 즉, QSystemSemaphore는 훨씬 더 무거운 클래스이므로, 애플리케이션에서 여러 프로세스에 걸쳐 세마포어에 액세스할 필요가 없다면 QSemaphore 를 사용하는 것이 좋습니다.

세마포어는 두 가지 기본 연산인 acquire()과 release()을 지원합니다:

acquire()는 하나의 리소스를 확보하려고 시도합니다. 사용 가능한 리소스가 없으면, 리소스가 확보될 때까지 호출이 차단됩니다. 그런 다음 리소스가 확보되면 호출이 반환됩니다.

release()는 다른 프로세스가 획득할 수 있도록 리소스 하나를 해제합니다. 이 함수는 매개변수 n > 1을 지정하여 호출할 수도 있으며, 이 경우 n개의 리소스를 해제합니다.

시스템 세마포어는 QNativeIpcKey 로 표현되는 키로 식별됩니다. 키는 platformSafeKey()를 사용하여 크로스 플랫폼 방식으로 생성할 수 있습니다. AccessMode::Create 를 액세스 모드 매개변수로 전달하면 QSystemSemaphore 생성자에 의해 시스템 세마포어가 생성됩니다. 일단 생성되면, 다른 프로세스들은 동일한 키와 AccessMode::Open 를 액세스 모드 매개변수로 사용하여 동일한 세마포어에 연결할 수 있습니다.

예제: 시스템 세마포어 생성

QSystemSemaphore sem(QSystemSemaphore::platformSafeKey("market"), 3, QSystemSemaphore::Create);
                             // resources available == 3
sem.acquire();               // resources available == 2
sem.acquire();               // resources available == 1
sem.acquire();               // resources available == 0
sem.release();               // resources available == 1
sem.release(2);              // resources available == 3

키 유형, 플랫폼별 제한 사항, 구형 또는 비-Qt 애플리케이션과의 상호 운용성에 대한 자세한 내용은 네이티브 IPC 키(Native IPC Keys ) 문서를 참조하십시오. 여기에는 Apple App Store를 통해 다운로드한 모든 앱을 포함하여 Apple 플랫폼의 샌드박스화된 애플리케이션에 대한 중요한 정보가 포함되어 있습니다.

또한 프로세스 간 통신(Inter-Process Communication), QSharedMemory 및 QSemaphore 을참조하십시오 .

멤버 유형 문서

enum QSystemSemaphore::AccessMode

이 열거형은 생성자와 ` setKey()` 함수에서 사용됩니다. 이 열거형의 목적은 크래시 후에도 유지되는 유닉스 세마포어 구현에서 발생하는 문제를 처리할 수 있도록 하는 것입니다. 유닉스에서 세마포어가 크래시 후에도 유지될 경우, 시스템이 해당 세마포어를 재사용할 때 리소스 카운트를 강제로 초기화할 방법이 필요합니다. 세마포어가 시스템 충돌을 견디지 못하는 Windows에서는 이 열거형이 아무런 영향을 미치지 않습니다.

상수값설명
QSystemSemaphore::Open0세마포어가 이미 존재하는 경우, 초기 리소스 카운트는 재설정되지 않습니다. 세마포어가 아직 존재하지 않는 경우, 세마포어가 생성되고 초기 리소스 카운트가 설정됩니다.
QSystemSemaphore::Create1QSystemSemaphore 세마포어가 이미 존재하는지 여부와 상관없이(크래시 후에도 살아남은 경우 포함) 세마포어의 소유권을 가져오고 리소스 수를 요청된 값으로 설정합니다. 이 값은 특정 키에 대한 첫 번째 세마포어가 생성될 때, 세마포어가 이미 존재한다면 그 이유는 크래시 때문일 수밖에 없다는 것을 알고 있는 경우, 생성자에 전달해야 합니다. 세마포어가 시스템 충돌 후에도 유지될 수 없는 Windows 환경에서는 Create와 Open의 동작이 동일합니다.

enum QSystemSemaphore::SystemSemaphoreError

상수값설명
QSystemSemaphore::NoError0오류가 발생하지 않았습니다.
QSystemSemaphore::PermissionDenied1호출자에게 필요한 권한이 없어 작업이 실패했습니다.
QSystemSemaphore::KeyError2유효하지 않은 키로 인해 작업이 실패했습니다.
QSystemSemaphore::AlreadyExists3지정된 키를 가진 시스템 세마포어가 이미 존재하여 작업이 실패했습니다.
QSystemSemaphore::NotFound4지정된 키를 가진 시스템 세마포어를 찾을 수 없어 작업이 실패했습니다.
QSystemSemaphore::OutOfResources5요청을 처리할 수 있는 충분한 메모리가 없어 작업이 실패했습니다.
QSystemSemaphore::UnknownError6다른 문제가 발생했으며, 그 결과는 좋지 않았습니다.

멤버 함수 문서

QSystemSemaphore::QSystemSemaphore(const QNativeIpcKey &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)

지정된 key 에 대한 시스템 세마포어를 요청합니다. 매개변수 initialValue 와 mode 는 시스템에 따라 달라지는 다음 규칙에 따라 사용됩니다.

유닉스에서 mode 가 Open 이고 시스템에 이미 key 로 식별되는 세마포어가 존재하는 경우, 해당 세마포어가 사용되며 세마포어의 리소스 카운트는 변경되지 않습니다. 즉, initialValue 는 무시됩니다. 그러나 시스템에 key 로 식별되는 세마포어가 아직 없는 경우, 해당 키에 대한 새로운 세마포어를 생성하고 그 자원 수를 initialValue 로 설정합니다.

Unix에서 mode 가 Create 이고 시스템에 이미 key 로 식별되는 세마포어가 존재하는 경우, 해당 세마포어가 사용되며 그 자원 개수는 initialValue 로 설정됩니다. 시스템에 key 로 식별되는 세마포어가 아직 없는 경우, 해당 키에 대한 새로운 세마포어를 생성하고 그 자원 개수를 initialValue 로 설정합니다.

Windows에서는 mode 가 무시되며, 시스템은 항상 지정된 key 에 대한 세마포어를 생성하려고 시도합니다. 시스템에 key 로 식별되는 세마포어가 아직 없는 경우, 해당 세마포어를 생성하고 리소스 카운트를 initialValue 로 설정합니다. 그러나 시스템에 key 로 식별되는 세마포어가 이미 있는 경우, 해당 세마포어를 사용하고 initialValue 는 무시합니다.

mode 매개변수는 유닉스 시스템에서만 사용되며, 프로세스 충돌 후에도 세마포어가 유지되는 경우를 처리하기 위한 것입니다. 이 경우, 동일한 key 을 사용하여 세마포어를 할당하려는 다음 프로세스는 충돌 후에도 남아 있는 세마포어를 얻게 되며, mode 이 Create 이 아닌 한, 리소스 카운트는 initialValue 으로 재설정되지 않고 충돌한 프로세스가 부여한 초기 값을 유지합니다.

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

QSystemSemaphore::QSystemSemaphore(const QString &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)

레거시 키 key 로 식별되는 시스템 세마포어를 요청합니다.

[noexcept] QSystemSemaphore::~QSystemSemaphore()

소멸자는 QSystemSemaphore 객체를 소멸시키지만, QSystemSemaphore 의 이 인스턴스가 해당 시스템 세마포어에 대해 존재하는 마지막 인스턴스가 아닌 한, 기본이 되는 시스템 세마포어는 시스템에서 제거되지 않습니다.

소멸자의 두 가지 중요한 부수 효과는 시스템에 따라 다릅니다. Windows에서, 이 세마포어에 대해 acquire()는 호출되었으나 release()는 호출되지 않은 경우, 소멸자에 의해 release()가 호출되지 않으며, 프로세스가 정상적으로 종료될 때도 리소스가 해제되지 않습니다. 이는 프로그램 버그로, 동일한 리소스를 확보하려는 다른 프로세스에서 교착 상태를 유발할 수 있습니다. 유닉스에서는 소멸자가 호출되기 전에 해제되지 않은 확보된 리소스는 프로세스가 종료될 때 자동으로 해제됩니다.

bool QSystemSemaphore::acquire()

사용 가능한 자원이 있는 경우, 이 세마포어가 보호하는 자원 중 하나를 확보하고 ` true`를 반환합니다. 이 세마포어가 보호하는 모든 자원이 이미 확보된 경우, 동일한 키를 가진 세마포어를 보유한 다른 프로세스나 스레드가 자원 중 하나를 해제할 때까지 호출이 차단됩니다.

false가 반환되면 시스템 오류가 발생한 것입니다. error()를 호출하여 어떤 오류가 발생했는지 나타내는 QSystemSemaphore::SystemSemaphoreError 값을 확인하십시오.

release()도 참조하십시오 .

QSystemSemaphore::SystemSemaphoreError QSystemSemaphore::error() const

오류가 발생했는지 여부와, 발생한 경우 어떤 오류인지 나타내는 값을 반환합니다.

errorString()도 참조하십시오 .

QString QSystemSemaphore::errorString() const

마지막으로 발생한 오류에 대한 텍스트 설명을 반환합니다. error()이 error value 를 반환하는 경우, 이 함수를 호출하여 오류를 설명하는 텍스트 문자열을 얻을 수 있습니다.

error()도 참조하십시오 .

QString QSystemSemaphore::key() const

이 시스템 세마포어에 할당된 레거시 키를 반환합니다. 이 키는 다른 프로세스에서 해당 세마포어에 접근할 때 사용하는 이름입니다.

setKey()도 참조하십시오 .

QNativeIpcKey QSystemSemaphore::nativeIpcKey() const

이 시스템 세마포어에 할당된 키를 반환합니다. 이 키는 다른 프로세스에서 해당 세마포어에 접근할 때 사용하는 이름입니다.

네이티브 키를 사용하면 Qt에서 생성하지 않은 시스템 세마포어에 접근하거나, Qt가 아닌 애플리케이션에 접근 권한을 부여할 수 있습니다. 자세한 내용은 네이티브 IPC 키를 참조하십시오.

setNativeKey()도 참조하십시오 .

bool QSystemSemaphore::release(int n = 1)

세마포어가 보호하는 리소스 n 를 해제합니다. 시스템 오류가 발생하지 않는 한 true 를 반환합니다.

예: 5개의 리소스를 가진 시스템 세마포어를 생성하고, 이 리소스를 모두 획득한 다음 모두 해제합니다.

QSystemSemaphore sem(QSystemSemaphore::platformSafeKey("market"), 5, QSystemSemaphore::Create);
for (int i = 0; i < 5; ++i)  // acquire all 5 resources
    sem.acquire();
sem.release(5);              // release the 5 resources

이 함수는 리소스를 “생성”할 수도 있습니다. 예를 들어, 위의 문장 순서 바로 뒤에 다음 문장을 추가한다고 가정해 봅시다.

sem.release(10);          // "create" 10 new resources

이제 기존에 있던 5개 리소스에 더해 10개의 새로운 리소스가 세마포어에 의해 보호됩니다. 일반적으로 이 함수를 사용하여 리소스를 추가로 생성하지는 않습니다.

acquire()도 참조하십시오 .

void QSystemSemaphore::setKey(const QString &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)

이 함수는 생성자와 동일하게 작동합니다. 이 함수는 이 QSystemSemaphore 객체를 재구성합니다. 새로운 key 가 기존 키와 다른 경우, 이 함수를 호출하는 것은 기존 키를 사용하여 세마포어의 소멸자를 호출한 다음, 새로운 key 로 새로운 세마포어를 생성하기 위해 생성자를 호출하는 것과 같습니다. initialValue 및 mode 매개변수는 생성자에서 정의된 것과 동일합니다.

QSystemSemaphore() 및 key()도 참조하십시오 .

void QSystemSemaphore::setNativeKey(const QNativeIpcKey &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)

이 함수는 생성자와 동일한 방식으로 작동합니다. 이 함수는 이 QSystemSemaphore 객체를 재구성합니다. 새로운 key 가 기존 키와 다른 경우, 이 함수를 호출하는 것은 기존 키를 사용하여 세마포어의 소멸자를 호출한 다음, 생성자를 호출하여 새로운 key 로 새로운 세마포어를 생성하는 것과 같습니다. initialValue 및 mode 매개변수는 생성자에서 정의된 것과 동일합니다.

이 함수는 네이티브 키가 다른 프로세스에서 공유된 경우에 유용합니다. 자세한 내용은 네이티브 IPC 키 (Native IPC Keys )를 참조하십시오.

QSystemSemaphore() 및 nativeIpcKey()도 참조하십시오 .

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