QSharedMemory共享内存

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 
#include 
#include 

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();
}

Shared2代码如下:
#include 
#include 
#include 
#include 

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();
}
同时启动两个程序,运行结果如下:
QSharedMemory共享内存_第1张图片

QSharedMemory共享内存_第2张图片

说明,我们从共享内存中读取到了我们写入的信息。
并且,还有注意第一幅图中,我们打印出的共享内存的大小。我们在使用create()函数创建共享内存时,明明指定的大小是100字节,但打印出的大小却是4096字节,可见QSharedMemory类会将共享内存块的大小舍入到系统内存页面的大小,即4k。

你可能感兴趣的:(Qt)