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 是一个更重的类,因此如果您的应用程序不需要跨多个进程访问 Semaphores,您可能希望使用QSemaphore 。
Semaphores 支持两种基本操作:acquire() 和release() :
acquire() 尝试获取一个资源。如果没有可用资源,调用就会阻塞,直到出现可用资源。然后获取资源并返回调用。
release() 释放一个资源,以便另一个进程获取。在调用该函数时,参数 n > 1 也会释放 n 个资源。
系统 semaphores 由一个 key 标识,用QNativeIpcKey 表示。可以使用 platformSafeKey() 以跨平台方式创建密钥。当 QSystemSemaphore 构造函数传入一个 AccessMode::Create 访问模式参数时,就会创建一个系统信号。创建完成后,其他进程可使用相同的密钥和 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 密钥文档。其中包括苹果平台上沙箱应用程序的重要信息,包括通过苹果应用商店获取的所有应用程序。
另请参阅 进程间通信、QSharedMemory 和QSemaphore 。
成员类型文档
enum QSystemSemaphore::AccessMode
构造函数和setKey() 使用该枚举。该枚举的目的是处理 Unix 实现中的信号传递器崩溃后存活的问题。在 Unix 中,当一个寄存器在崩溃后存活下来时,我们需要一种方法来强制它在系统重新使用该寄存器时重置其资源计数。而在 Windows 系统中,由于 Semaphore 无法在崩溃后存活,因此该枚举没有任何作用。
常量 | 值 | 说明 |
---|---|---|
QSystemSemaphore::Open | 0 | 如果 semaphore 已存在,则不会重置其初始资源计数。如果该信号堆不存在,则创建该信号堆并设置其初始资源计数。 |
QSystemSemaphore::Create | 1 | QSystemSemaphore 无论 Semaphore 是否因崩溃而已经存在,"semaphore.org "都会获取 Semaphore 的所有权,并将其资源计数设置为所请求的值。在为特定键创建第一个信号存储空间时,应将此值传递给构造函数,因为如果该信号存储空间已经存在,则可能是因为崩溃。在 Windows 操作系统中,由于 Semaphore 无法在崩溃中存活,因此 Create 和 Open 也具有相同的行为。 |
enum QSystemSemaphore::SystemSemaphoreError
常数 | 值 | 说明 |
---|---|---|
QSystemSemaphore::NoError | 0 | 未发生错误。 |
QSystemSemaphore::PermissionDenied | 1 | 操作失败是因为调用者没有所需的权限。 |
QSystemSemaphore::KeyError | 2 | 由于键无效,操作失败。 |
QSystemSemaphore::AlreadyExists | 3 | 操作失败的原因是指定密钥的系统寄存器已经存在。 |
QSystemSemaphore::NotFound | 4 | 操作失败的原因是找不到具有指定密钥的系统寄存器。 |
QSystemSemaphore::OutOfResources | 5 | 操作失败的原因是可用内存不足,无法满足请求。 |
QSystemSemaphore::UnknownError | 6 | 发生了其他糟糕的情况。 |
成员函数文档
QSystemSemaphore::QSystemSemaphore(const QNativeIpcKey &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)
为指定的key 申请一个系统寄存器。参数initialValue 和mode 根据以下规则使用,这些规则与系统有关。
在 Unix 系统中,如果mode 是Open ,且系统已经有一个由key 标识的信号寄存器,则使用该信号寄存器,不改变信号寄存器的资源计数,即忽略initialValue 。但如果系统中还没有由key 标识的寄存器,则会为该键创建一个新的寄存器,并将其资源计数设置为initialValue 。
在 Unix 中,如果mode 是Create ,且系统已经有一个由key 标识的信号寄存器,则使用该信号寄存器,并将其资源计数设置为initialValue 。如果系统还没有由key 标识的信号寄存器,则为该键创建一个新的信号寄存器,并将其资源计数设置为initialValue 。
在 Windows 中,mode 会被忽略,系统会一直尝试为指定的key 创建一个 semaphore。如果系统中还没有标识为key 的寄存器,则会创建该寄存器,并将其资源计数设置为initialValue 。但如果系统中已经有标识为key 的寄存器,则会使用该寄存器,并忽略initialValue 。
mode 参数仅在 Unix 系统中使用,用于处理进程崩溃后 semaphore 仍然存在的情况。在这种情况下,下一个分配具有相同key 的 semaphore 的进程将获得在崩溃中幸存的 semaphore,除非mode 是Create ,否则资源计数不会重置为initialValue ,而是保留崩溃进程给定的初始值。
QSystemSemaphore::QSystemSemaphore(const QString &key, int initialValue = 0, QSystemSemaphore::AccessMode mode = Open)
请求使用传统密钥key 标识的系统寄存器。
[noexcept]
QSystemSemaphore::~QSystemSemaphore()
析构函数会销毁QSystemSemaphore 对象,但底层系统信号并不会从系统中删除,除非QSystemSemaphore 实例是该系统信号的最后一个实例。
析构函数的两个重要副作用取决于系统。在 Windows 系统中,如果调用了该半寄存器的acquire() 而未调用release() ,析构函数将不会调用release(),进程正常退出时也不会释放该资源。这将是一个程序错误,可能会导致试图获取相同资源的另一个进程陷入僵局。在 Unix 中,在调用析构函数前未释放的已获取资源会在进程退出时自动释放。
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
返回分配给此系统 semaphore 的传统密钥。密钥是其他进程访问 Semaphore 的名称。
另请参阅 setKey()。
QNativeIpcKey QSystemSemaphore::nativeIpcKey() const
返回分配给此系统 semaphore 的密钥。密钥是一个名称,其他进程可以通过它访问该 semaphore。
您可以使用本地密钥访问非 Qt 创建的系统 semaphore,或授予非 Qt 应用程序访问权。更多信息,请参阅本地 IPC 密钥。
另请参阅 setNativeKey().
bool QSystemSemaphore::release(int n = 1)
释放由 semaphore 保护的n 资源。除非出现系统错误,否则返回true
。
示例创建一个有五个资源的系统信号;获取所有资源,然后释放所有资源。
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
除了已经存在的五个资源外,现在又有十个新的资源由该信号守护。通常情况下,您不会使用此函数来创建更多资源。
另请参阅 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 密钥。
另请参阅 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.