このページでは

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() の 2 つの基本的な操作をサポートしています。

acquire() は 1 つのリソースを取得しようとします。利用可能なリソースがない場合、呼び出しはリソースが利用可能になるまでブロックされます。その後、リソースが取得され、呼び出しは戻ります。

release() は、別のプロセスが取得できるように、1つのリソースを解放します。この関数は、パラメータ 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以外のアプリケーションとの相互運用性に関する詳細については、「Native IPC Keys」のドキュメントを参照してください。これには、Appleプラットフォーム上のサンドボックス化されたアプリケーション(Apple App Store経由で入手したすべてのアプリを含む)に関する重要な情報が含まれています。

「プロセス間通信」、QSharedMemory 、およびQSemaphoreも参照してください 。

メンバ型のドキュメント

enum QSystemSemaphore::AccessMode

この列挙型は、コンストラクタおよびsetKey() によって使用されます。その目的は、クラッシュ後も存続する Unix 実装のセマフォにおける問題に対処できるようにすることです。Unix では、セマフォがクラッシュ後も存続する場合、システムがそのセマフォを再利用する際に、リソースカウントを強制的にリセットする方法が必要となります。 クラッシュを生き延びることができない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 は、システムに依存する以下の規則に従って使用されます。

Unix では、mode がOpen で、システムにkey で識別されるセマフォがすでに存在する場合、そのセマフォが使用され、セマフォのリソースカウントは変更されません。つまり、initialValue は無視されます。 しかし、システムにkey で識別されるセマフォがまだ存在しない場合、そのキーに対して新しいセマフォが作成され、そのリソースカウントはinitialValue に設定される。

Unix では、mode がCreate であり、システムにkey で識別されるセマフォがすでに存在する場合、そのセマフォが使用され、そのリソースカウントはinitialValue に設定されます。システムにkey で識別されるセマフォがまだ存在しない場合、そのキーに対して新しいセマフォが作成され、そのリソースカウントはinitialValue に設定されます。

Windows では、mode は無視され、システムは常に指定されたkey に対してセマフォの作成を試みます。システムにkey で識別されるセマフォがまだ存在しない場合、そのセマフォを作成し、そのリソースカウントをinitialValue に設定します。しかし、システムにkey で識別されるセマフォがすでに存在する場合、そのセマフォを使用し、initialValue は無視されます。

mode パラメータは、プロセスのクラッシュ後もセマフォが存続する場合に対処するために、Unixシステムでのみ使用されます。 その場合、同じkey を持つセマフォを割り当てる次のプロセスは、クラッシュを生き延びたセマフォを取得することになります。また、mode がCreate でない限り、リソースカウントはinitialValue にリセットされず、クラッシュしたプロセスによって与えられた初期値のまま保持されます。

acquire() およびkey()も参照してください 。

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

レガシーキー「key 」で識別されるシステムセマフォを要求します。

[noexcept] QSystemSemaphore::~QSystemSemaphore()

デストラクタはQSystemSemaphore オブジェクトを破棄しますが、このQSystemSemaphore のインスタンスが、そのシステムセマフォに対して存在する最後のインスタンスでない限り、基となるシステムセマフォはシステムから削除されません。

デストラクタによる 2 つの重要な副作用は、システムによって異なります。Windows では、このセマフォに対して `acquire()` が呼び出されているが `release()` が呼び出されていない場合、デストラクタによって `release()` は呼び出されず、プロセスが正常に終了してもリソースは解放されません。 これはプログラムのバグであり、同じリソースを取得しようとする別のプロセスでデッドロックが発生する原因となる可能性があります。Unix では、デストラクタが呼び出される前に解放されなかった取得済みリソースは、プロセスの終了時に自動的に解放されます。

bool QSystemSemaphore::acquire()

利用可能なリソースがある場合、このセマフォによって保護されているリソースの1つを取得し、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キー」を参照してください。

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.