Qt中,使用类QSharedMemory来实现对共享内存段的存取。
类QSharedMemory对共享内存段的存取,既支持多线程或多进程也支持单线程或进程中的情形。后者采用内存锁的方式来实现独占式访问。
使用类QSharedMemory的对象进行内存共享时,注意平台差异:
- 在Windows平台下,QSharedMemory对象并不“拥有”共享内存段(共享内存段仍旧归操作系统所有)。当连接到某个共享内存段对象的所有线程或进程都与该内存段断开连接时,操作系统会自动释放该内存段。此处,连接到某个共享内存段的线程或进程,或者主动释放共享内存对象,或者线程或进程退出时,操作系统释放该内存段。
- 在Unix平台下,QSharedMemory对象并“拥有”共享内存段。最后一个连接到该共享内存对象的线程或进程通过释放共享内存对象,从而断开与共享内存对象的连接,此时Unix内核释放该共享内存段。但是,如果最后一个连接到该共享对象的线程或进程崩溃,且在崩溃之前没有释放(也可以叫析构)该共享内存对象,那么该共享内存段就不会被释放,造成内存段泄漏(无法被申请使用)。
- 在HP-UX平台下,每个进程只能有一个连接到某个共享内存段,即共享内存只能在某个进程的某一个线程中使用,无法跨线程使用共享内存。
注意,在读/写共享内存对象之前需要加锁,读取/写入完毕要释放锁。
类QSharedMemory提供一种自动释放共享内存的机制:当最后一个连接到共享内存对象的线程或者进程主动断开连接没有对共享内存段进行应用时,该共享内存段会被自动释放。
Warning:除非指定共享内存的键值,QSharedMemory将以Qt独有的方式来改变键值。在与non-Qt应用程序的交互中,首先需要创建一个默认的共享内存对象,然后使用函数setNativeKey()设置本地的键值。当使用本地的键值使用共享内存对象时,共享内存失去了多个访问的保护机制(例如,无法使用QSharedMemory类提供的lock()函数),需要自定义多访问保护机制来提供共享内存段的保护。