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