QSystemSemaphore Class

QSystemSemaphore 클래스는 일반 계수 시스템 세마포어를 제공합니다. 더 보기...

Header: #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 과는 달리, 여러 개의 processes 에서도 액세스할 수 있습니다. 즉, Q시스템세마포어가 훨씬 무거운 클래스이므로 응용 프로그램이 여러 프로세스에서 세마포어에 액세스할 필요가 없는 경우 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 키 설명서를 참조하십시오. 여기에는 Apple 앱 스토어를 통해 얻은 모든 앱을 포함하여 Apple 플랫폼의 샌드박스 애플리케이션에 대한 중요한 정보가 포함되어 있습니다.

또한 프로세스 간 통신, QSharedMemoryQSemaphore참조하세요 .

멤버 유형 문서

enum QSystemSemaphore::AccessMode

이 열거형은 생성자와 setKey()에서 사용됩니다. 그 목적은 충돌 후에도 살아남는 세마포어의 유닉스 구현에서 문제를 처리할 수 있도록 하기 위한 것입니다. 유닉스에서는 세마포어가 크래시에서 살아남으면 시스템이 세마포어를 재사용할 때 리소스 수를 강제로 재설정하는 방법이 필요합니다. 세마포어가 크래시에서 살아남을 수 없는 Windows에서는 이 열거형에 아무런 효과가 없습니다.

Constant설명
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 에 대한 시스템 세마포어를 요청합니다. initialValuemode 매개변수는 다음 규칙에 따라 사용되며, 이는 시스템에 따라 다릅니다.

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

Unix에서 modeCreate 이고 시스템에 key 로 식별되는 세마포어가 이미 있는 경우 해당 세마포어가 사용되고 리소스 카운트는 initialValue 로 설정됩니다. 시스템에 key 로 식별되는 세마포어가 아직 없는 경우 해당 키에 대한 새 세마포어를 생성하고 리소스 카운트는 initialValue 로 설정됩니다.

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

mode 매개변수는 프로세스 충돌 후에도 세마포어가 살아남는 경우를 처리하기 위해 유닉스 시스템에서만 사용됩니다. 이 경우 동일한 key 으로 세마포어를 할당하는 다음 프로세스는 충돌에서 살아남은 세마포어를 사용하게 되며, modeCreate 이 아닌 경우 리소스 카운트는 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 로 새 세마포어를 생성하는 것과 같습니다. initialValuemode 매개변수는 생성자에 대해 정의된 대로입니다.

QSystemSemaphore() 및 key()도 참조하세요 .

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

이 함수는 생성자와 동일하게 작동합니다. 이 QSystemSemaphore 객체를 재구성합니다. 새 key 이 이전 키와 다른 경우 이 함수를 호출하는 것은 이전 키로 세마포어의 소멸자를 호출한 다음 생성자를 호출하여 새 key 로 새 세마포어를 생성하는 것과 같습니다. initialValuemode 매개변수는 생성자에 대해 정의된 대로입니다.

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

QSystemSemaphore() 및 nativeIpcKey()도 참조하세요 .

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