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 とは異なり、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プラットフォーム上のサンドボックス・アプリケーションに関する重要な情報も含まれています。

プロセス間通信QSharedMemoryQSemaphoreも参照してください

メンバ型ドキュメント

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 に対してシステムセマフォをリクエストする。パラメータinitialValuemode は、システムに依存する以下の規則に従って使用される。

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

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

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

mode パラメーターは、セマフォがプロセス・クラッシュを生き延びた場合を処理する ために、Unixシステムでのみ使用される。この場合、次に同じkey でセマフォを割り当てるプロセスは、クラッシュを免れたセマフォを取得します。modeCreate でない限り、リソースカウントは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つでも利用可能であれば、その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 で新しいセマフォを作成するようなものである。initialValuemode のパラメータは、コンストラクタで定義されているとおりです。

QSystemSemaphore() およびkey()も参照のこと

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

この関数はコンストラクタと同じ動作をします。この関数は、このQSystemSemaphore オブジェクトを再構築します。新しいkey が古いキーと異なる場合、この関数を呼び出すことは、古いキーのセマフォのデストラクタを呼び出した後、コンストラクタを呼び出して新しいkey で新しいセマフォを作成するようなものです。initialValuemode パラメータはコンストラクタで定義されているとおりである。

この関数は、ネイティブ・キーが他のプロセスから共有された場合に便利です。詳細は「ネイティブIPCキー」を参照。

QSystemSemaphore() およびnativeIpcKey()も参照してください

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。