QSharedMemory + QSystemSemaphore实现进程间通讯的思路、关键点,并附一个完整可运行的Qt Demo(Qt Creator工程)
详细介绍QSharedMemory + QSystemSemaphore实现进程间通讯的思路、关键点,并附一个完整可运行的Qt Demo(Qt Creator工程),便于直接下载编译。
更完整的工程下载地址:https://download.csdn.net/download/2501_91893428/91956868
🧩 原理说明
1. QSharedMemory
-
用于在不同进程间共享一段内存。
-
通过一个key标识同一块共享内存。
-
支持
create()
、attach()
来创建或附加到已有内存。 -
需要
lock()
和unlock()
保证访问时的互斥。
2. QSystemSemaphore
-
提供跨进程的信号量机制,用于在共享内存访问前后做互斥锁。
-
与 QSharedMemory 搭配,避免竞争条件和死锁。
3. 通信流程
-
写进程(Producer):
-
获取信号量 →
acquire()
-
lock()
→ 写入数据 →unlock()
-
释放信号量 →
release()
-
-
读进程(Consumer):
-
获取信号量 →
acquire()
-
lock()
→ 读取数据 →unlock()
-
释放信号量 →
release()
-
📁 项目结构
SharedMemoryDemo/
├─ writer/ (写进程)
│ ├─ main.cpp
│ ├─ writer.pro
│
└─ reader/ (读进程)├─ main.cpp├─ reader.pro
两个独立的可执行程序,共享同一段内存。
💻 writer/main.cpp(写进程)
#include <QCoreApplication>
#include <QSharedMemory>
#include <QSystemSemaphore>
#include <QTextStream>
#include <QTimer>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSystemSemaphore semaphore("SharedMemoryDemoKey", 1); // 信号量KeyQSharedMemory sharedMemory("SharedMemoryDemoMem"); // 内存Key// 创建共享内存,如果已经存在则附加if (!sharedMemory.create(1024)) {if (!sharedMemory.attach()) {qCritical("Failed to create/attach shared memory");return -1;}}QTextStream cin(stdin);QTextStream cout(stdout);cout << "Writer Process Started.\n";cout << "Type a message and press Enter (or 'exit' to quit):\n";while (true) {cout << "> " << flush;QString input = cin.readLine();if (input == "exit") break;semaphore.acquire(); // 🔒 信号量if (sharedMemory.lock()) {char *to = (char*)sharedMemory.data();memset(to, 0, sharedMemory.size());QByteArray data = input.toUtf8();memcpy(to, data.constData(), qMin(data.size(), sharedMemory.size()-1));sharedMemory.unlock();}semaphore.release(); // 🔓 信号量}return 0;
}
💻 reader/main.cpp(读进程)
#include <QCoreApplication>
#include <QSharedMemory>
#include <QSystemSemaphore>
#include <QTextStream>
#include <QTimer>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSystemSemaphore semaphore("SharedMemoryDemoKey", 1);QSharedMemory sharedMemory("SharedMemoryDemoMem");if (!sharedMemory.attach()) {qCritical("Failed to attach shared memory");return -1;}QTextStream cout(stdout);cout << "Reader Process Started. Waiting for messages...\n";QTimer timer;QObject::connect(&timer, &QTimer::timeout, [&]() {semaphore.acquire(); // 🔒if (sharedMemory.lock()) {const char *from = (const char*)sharedMemory.constData();QString message = QString::fromUtf8(from);if (!message.isEmpty())cout << "Received: " << message << "\n";sharedMemory.unlock();}semaphore.release(); // 🔓});timer.start(1000);return a.exec();
}
⚙️ 编译与运行步骤
-
在 Qt Creator 中分别打开 writer.pro 和 reader.pro,编译生成两个可执行文件。
-
先启动 reader(读进程),再启动 writer(写进程)。
-
在 writer 控制台输入消息,reader 会每秒检测并输出最新消息。
🔑 关键点与注意事项
-
信号量Key与共享内存Key要一致(两个进程使用同一字符串)。
-
读写时都要
lock()/unlock()
+acquire()/release()
,避免数据竞争。 -
QSharedMemory大小必须提前规划,不可动态扩展。
-
共享内存中仅存放原始字节,不要直接存放 Qt 对象。
✅ 总结
QSharedMemory + QSystemSemaphore
是一种简单、高效、跨平台的进程间通信方式,适合传递小量文本/二进制数据。