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() はリソースを解放し、別のプロセスが取得できるようにします。この関数はパラメータ 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 App Store経由で入手したすべてのアプリを含む、Appleプラットフォーム上のサンドボックス・アプリケーションに関する重要な情報も含まれています。
プロセス間通信、QSharedMemory 、QSemaphoreも参照してください 。
メンバ型ドキュメント
enum QSystemSemaphore::AccessMode
この列挙型はコンストラクタとsetKey() で使用される。この列挙型の目的は、Unixの実装において、クラッシュしてもセマフォが生き残るという問題に対処できるようにすることです。Unixでは、セマフォがクラッシュしても生き残る場合、システムがセマフォを再利用するときにリソースカウントを強制的にリセットする方法が必要です。Windowsでは、セマフォがクラッシュしても生き残ることはできないので、この列挙は何の効果もありません。
定数 | 値 | 説明 |
---|---|---|
QSystemSemaphore::Open | 0 | セマフォが既に存在する場合、初期リソースカウントはリセットされません。セマフォがまだ存在しない場合、作成され、初期リソースカウントが設定されます。 |
QSystemSemaphore::Create | 1 | QSystemSemaphore はセマフォの所有権を取得し、そのリソースカウントを要求された値に設定します。この値は、特定のキーに対する最初のセマフォが作成され、そのセマフォが既に存在する場合はクラッシュのためだけであることが分かっている場合に、コンストラクタに渡されるべきです。セマフォがクラッシュに耐えることができないWindowsでは、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 に対してセマフォを作成しようとする。システムがまだkey として識別されるセマフォを持っていない場合、セマフォを作成し、そのリソースカウントをinitialValue に設定する。 しかし、システムがすでにkey として識別されるセマフォを持っている場合、そのセマフォを使用し、initialValue を無視する。
mode パラメーターは、セマフォがプロセス・クラッシュを生き延びた場合を処理する ために、Unixシステムでのみ使用される。この場合、次に同じkey でセマフォを割り当てるプロセスは、クラッシュを免れたセマフォを取得します。mode がCreate でない限り、リソースカウントはinitialValue にリセットされず、クラッシュしたプロセスから与えられた初期値が保持されます。
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
を返す。このセマフォによって保護されているすべてのリソースがすでに獲得されている場合、同じキーのセマフォを持つ他のプロセスまたはスレッドによってその1つが解放されるまで、呼び出しはブロックされる。
false が返された場合、システム・エラーが発生した。どのエラーが発生したかを示すQSystemSemaphore::SystemSemaphoreError の値を取得するには、error()を呼び出す。
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()も参照のこと 。
© 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.