2

我正在编写一个应用程序,用于学习目的,它由两个可执行文件组成。除其他外,每个可执行文件创建自己的共享内存段(使用不同的密钥),之后可执行文件 A 尝试使用 B 的密钥创建一个段,而 B 对 A 的密钥执行相同操作(这样做的目的是针对每个可执行文件检查另一个是否仍在运行。我知道这可能不是完成此任务的最佳方法,但我要求您不要专注于这个事实)。如果任何一个程序成功地使用另一个程序的密钥创建了一个段,它就会假设另一个程序没有运行并相应地采取行动。

发生的问题是,当 B 检查 A 时,这可以正常工作。但是当 A 检查 B 时,它可以使用 B 已经创建的相同键创建一个段。我很确定我检查了所有可能的竞争条件,而且我也很确定这两个段同时存在并具有相同的键(两个 QSharedMemory 使用此键创建调用都返回 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.";
}
4

1 回答 1

1

因此,在其他几个场合摆弄代码后,我发现问题正在发生,因为我在类/对象内创建共享内存段,并且出于某种原因(我相信与对象的生命周期有关)它在创建后立即被销毁。将创建内存段的代码移动到 main.cpp 文件解决了这个问题。

于 2016-01-02T09:12:49.023 回答