QT:QSharedMemory正在用同一个键创建多个段

QT: QSharedMemory is creating multiple segments with the same key

本文关键字:创建 同一个 QSharedMemory QT      更新时间:2023-10-16

为了学习,我正在编写一个由两个可执行文件组成的应用程序。除其他外,每个可执行文件都会创建一个自己的共享内存段(使用不同的密钥),然后可执行文件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.";
}

因此,在处理了其他一些地方的代码后,我发现问题的发生是因为我在类/对象中创建了共享内存段,并且由于某种原因(我认为与对象的生命周期有关),它在创建后就被销毁了。将创建内存段的代码移到main.cpp文件中解决了问题。