QT:QSharedMemory正在用同一个键创建多个段
QT: QSharedMemory is creating multiple segments with the same key
为了学习,我正在编写一个由两个可执行文件组成的应用程序。除其他外,每个可执行文件都会创建一个自己的共享内存段(使用不同的密钥),然后可执行文件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文件中解决了问题。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 创建了三个线程来实例化同一个类.但很快只有一个线程继续运行
- QT:QSharedMemory正在用同一个键创建多个段
- 一遍又一遍地创建同一个文本文件
- 在编译时用不同的函数创建同一个类的对象
- 是否可以在同一个类中创建一个类的实例