学習目的で、2 つの実行可能ファイルで構成されるアプリケーションを作成しています。とりわけ、各実行可能ファイルは独自の共有メモリ セグメントを (異なるキーで) 作成し、その後、実行可能ファイル A は B のキーを使用してセグメントを作成しようとし、B は A のキーを使用して同じことを行います (この目的は、各実行可能ファイルに対してです)。これがおそらくこれを達成する最良の方法ではないことはわかっていますが、この事実に集中しないでください)。いずれかのプログラムが他方のキーを使用してセグメントの作成に成功すると、他方が実行されていないと見なし、それに応じてアクションを実行します。
発生する問題は、B が A をチェックするとこれが正常に機能することです。しかし、A が B をチェックすると、B が既に作成したのと同じキーでセグメントを作成できます。私は可能なすべての競合状態をチェックしたと確信しており、両方のセグメントが同じキーで同時に存在することも確信しています(このキーを使用した両方の QSharedMemory create 呼び出しは true を返します)。実際、笑いのために、私は create 呼び出しをループ内に配置しました。ループが続く限り、同じキーでセグメントを作成し続けることができます。setKey() と setNativeKey() を使用して、コンストラクターで直接キーを渡そうとしましたが、どれも機能しませんでした。
そして、前に述べたように、私の頭を悩ませているのは、B が A をチェックする場合には同じアプローチが機能するが、その逆は機能しないということです。
なぜこれが起こっているのかわかりませんか?キーは標準に従う必要がありますか? スレッド/シグナル/メソッド内で使用する場合、QSharedMemory には制限または特定の動作がありますか?
A のコード スニペット (メソッドはシグナルを使用して呼び出されます - 動作しません):
//Process A "signature" creation
QSharedMemory process_a_signature("61BB200D-3579-453e-9044-");
if(process_a_signature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process A signature created.";
} else exit(0);
...
//Method that checks for process B (monitor)
void LaRunTime::checkMonitorProcess(){
QSharedMemory monitorsignature("61BB201D-3569-453e-9144-");
if(monitorsignature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process B is not running.";
} else {
qDebug() << "Process B is running.";
}
Bのコードスニペット(シグナルを使用してメソッドも呼び出されます-WORKS)
//Process B "signature" creation
QSharedMemory monitorsignature("61BB201D-3569-453e-9144-");
if(monitorsignature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process B signature created.";
} else {
exit(0);
}
...
//Method that checks for process A
void LaClientMonitor::checkProcess(){
QSharedMemory process_a_signature("61BB200D-3579-453e-9044-");
if(process_a_signature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process A is not running.";
} else {
qDebug() << "Process A is running.";
}