首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT: QSharedMemory使用相同的键创建多个段

QT: QSharedMemory使用相同的键创建多个段
EN

Stack Overflow用户
提问于 2015-12-20 05:27:26
回答 1查看 422关注 0票数 2

为了学习目的,我正在编写一个由两个可执行文件组成的应用程序。除其他外,每个可执行文件都创建自己的共享内存段(具有不同的键),在该可执行文件A尝试使用B的键创建一个段之后,B对A的键执行相同的操作(其目的是让每个可执行文件检查另一个文件是否仍在运行。我知道这可能不是实现这一目标的最好方法,但我要求你不要把注意力集中在这个事实上)。如果任何一个程序都成功地用另一个程序的键创建了一个段,它就会假设另一个程序没有运行,并采取相应的行动。

发生的问题是,当B检查A时,这是正常的,但是当A检查B时,它可以创建一个具有B已经创建的相同键的段。我确信我检查了所有可能的争用条件,我还很确定两个段同时存在,并且具有相同的键(两个QSharedMemory都用这个键创建调用,返回true)。实际上,只是为了咯咯笑,我已经将create调用放在了一个循环中,只要循环结束,它就可以继续用相同的键创建这个段。我尝试在构造函数中直接传递密钥,使用setKey()和setNativeKey(),但都没有工作。

正如前面说过的,真正困扰我的是,同样的方法适用于B检查A,而不是相反。

我不知道为什么会这样?钥匙必须遵循任何标准吗?QSharedMemory在线程/信号/方法中使用时是否有限制或特定行为?

A的代码片段(方法被称为使用信号-不工作):

代码语言:javascript
复制
//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的代码片段(方法也称为使用信号-工作)

代码语言:javascript
复制
//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.";
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-02 09:12:49

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34378260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档