QSharedMemory共享内存
来源:互联网 发布:消防工程师教材淘宝 编辑:程序博客网 时间:2024/06/16 16:08
QSharedMemory为多线程和多进程提供了访问共享内存段的功能。
但使用该类时,在不同的平台上会有一点差异:
- Windows:QSharedMemory对象不拥有共享内存段。当拥有一个关联在特定共享内存段上的QSharedMemory实例的线程或进程,在销毁它们的QSharedMemory实例时,Windows内核会自动释放共享内存段。
- Unix:QSharedMemory对象拥有共享内存段。当最后一个拥有关联在特定共享内存段的QSharedMemory实例的线程或进程,通过销毁QSharedMemory实例而从共享内存段detach时,Unix内核会释放共享内存段。但是,如果最后一个线程或进程没有运行QSharedMemory的析构函数就崩溃了,那么共享内存段会持续存在。
- HP-UX:在一个进程内,只能有一个线程关联到共享内存上,这意味着在该平台上,QSharedMemory不能在同一个进程的多个线程间使用。
还有,当我们在从共享内存段中读取或向其中写入数据时,应该先使用lock()锁定该共享内存段,并在访问完成后,使用unlock()来解锁。
QSharedMemory会在最后一个QSharedMemory实例从共享内存段detach()时,自动销毁共享内存段。
下面,我们写两个应用程序来使用一下该类。
新建两个控制台程序,Shared1和Shared2。其中,Shared1会创建共享内存,并向其中写入一个字符串;Shared2则从该共享内存段中读出相应的内容。
Shared1代码如下:
#include <QCoreApplication>#include <QSharedMemory>#include <QDebug>int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); QSharedMemory sm("SharedMem"); if(sm.isAttached()) { sm.detach();//将该进程与共享内存段分离 } if(!sm.create(100)) { qDebug() << "Create Shared Memory Failed"; return 0; } qDebug() << "share memory size: " << sm.size(); if(!sm.lock()) { qDebug() << "Can't lock the shared memory"; return 0; } const char* str = "hello, shared memory"; memcpy((char*)sm.data(), str, sm.size()); if(!sm.unlock()) { qDebug() << "Can't unlock the shared memory"; return 0; } qDebug() << "Write to shared memory: " << str; return a.exec();}
#include <QCoreApplication>#include <QSharedMemory>#include <QDebug>#include <QBuffer>int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); QSharedMemory sm("SharedMem"); if(!sm.attach()) { qDebug() << "Attach Shared Memory Failed"; return 0; } if(!sm.lock()) { qDebug() << "Can't lock the shared memory"; return 0; } QBuffer buf; buf.open(QIODevice::WriteOnly); buf.write((char*)sm.data()); buf.close(); if(!sm.unlock()) { qDebug() << "Can't unlock the shared memory"; return 0; } qDebug() << "Load from shared memory: " << buf.data(); return a.exec();}同时启动两个程序,运行结果如下:
说明,我们从共享内存中读取到了我们写入的信息。
并且,还有注意第一幅图中,我们打印出的共享内存的大小。我们在使用create()函数创建共享内存时,明明指定的大小是100字节,但打印出的大小却是4096字节,可见QSharedMemory类会将共享内存块的大小舍入到系统内存页面的大小,即4k。
0 0
- QSharedMemory共享内存
- QT 共享内存 QSharedMemory 和 内存映射
- QSharedMemory 共享内存 进程间通信
- Qt共享内存实现进程间通信(QSharedMemory)
- QSharedMemory
- QSharedMemory
- QSharedMemory类
- 【共享内存】共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- 共享内存
- MYSQL数据库规范-索引
- 输入3个整数,将它们按照从小到大顺序输出
- node 回调函数
- 利用matlab怎样进行频谱分析
- jqgrid 宽度充足 出现水平滚动条
- QSharedMemory共享内存
- cmake中PROJECT_SOURCE_DIR的遐思
- CSU1113——Updating a Dictionary(STL)
- 小虎CSDN博客友情链接火热报名中
- WebView 详解
- callable 和future
- MySQL数据库中,将一张表的数据插入到另一张表的各种情况
- 我的第一篇博客
- 见微知著---tar命令