Я пишу приложение для учебных целей, которое состоит из двух исполняемых файлов. Помимо прочего, каждый исполняемый файл создает собственный сегмент совместно используемой памяти (с разными ключами), после чего исполняемый файл A пытается создать сегмент, используя ключ B, а B делает то же самое с ключом A (цель этого — для каждого исполняемого файла). чтобы проверить, работает ли другой. Я знаю, что это, вероятно, не лучший способ сделать это, но я прошу вас не фокусироваться на этом факте). Если одна из программ успешно создает сегмент с ключом другой, она предполагает, что другая не запущена, и предпринимает соответствующие действия.
Проблема, которая возникает, состоит в том, что это работает нормально, когда B проверяет A. Но когда A проверяет B, он может создать сегмент с тем же ключом B, который уже создан. Я почти уверен, что проверил все возможные условия гонки, и я также уверен, что оба сегмента существуют одновременно с одним и тем же ключом (оба QSharedMemory создают вызовы с этим ключом, возвращающим true). На самом деле, просто для хихиканья, я поместил вызов create внутри цикла, и он может продолжать создавать сегмент с тем же ключом в течение всего цикла. Я попытался передать ключ непосредственно в конструкторе, используя setKey () и setNativeKey (), и ничего не получалось.
И, как уже было сказано, что меня действительно поражает, так это то, что тот же подход работает для проверки B, но не наоборот.
Я не знаю, почему это происходит? Должен ли ключ соответствовать каким-либо стандартам? Имеет ли QSharedMemory ограничение или специфическое поведение при использовании внутри потока / сигнала / метода?
Фрагмент кода А (метод вызывается с помощью сигналов — НЕ РАБОТАЕТ):
//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.";
}
Итак, поигравшись с кодом в нескольких других случаях, я обнаружил, что проблема возникла, потому что я создавал сегмент общей памяти внутри класса / объекта и по какой-то причине (я полагаю, что это связано с жизненным циклом объекта) он был уничтожен сразу после его создания.
Перемещение кода, который создает сегмент памяти в файл main.cpp, решило проблему.
Других решений пока нет …