QSharedMemory类

原文:http://doc.qt.io/qt-5.6/qsharedmemory.html


详细描述

QSharedMemory 类提供了对一段共享内存的访问。(译注:“一段共享内存”在后续译文中也译为“共享内存段”)

QSharedMemory 提供了被多线程和多进程共享的一段内存的访问。它也提供了方法,为单线程或单进程锁定内存以实现互斥访问。

当使用这个类的时候,要知道以下不同平台的差异:
  • Windows: QSharedMemory并不“拥有”这段共享内存。当所有“拥有一个QSharedMemory的实例从而附着于某一段共享内存”的进程或线程销毁了它们的QSharedMemory实例或者退出了,Windows内核会自动释放这一段共享内存。
  • Unix: QSharedM“拥有”这段共享内存。当最后一个拥有附着于某段共享内存的线程或进程通过销毁QSharedMemory实例从而与这段共享内存分离后,Unix内核会释放这段共享内存。但是如果最后这个线程或进程崩溃了而没有运行QSharedMemory的析构函数时,这段共享内存会逃过本次崩溃而没有被释放。
  • HP-UX: 每个进程只有一个线程能够附着于(attach to)一段共享内存。这就是说,在HP-UX上,QSharedMemory不应该被同一个进程内的多线程使用。
在读写共享内存前,要用lock();而在使用完毕后,要用unlock()来结束锁定。

当最后一个QSharedMemory的实例脱离共享内存后,即,没有任何对该段共享内存的引用时,QSharedMemory会自动销毁这段共享内存。

警告:QSharedMemory以Qt特有的方式改变key,否则就是平台相关的key. 一般先使用QSharedMemory()来创建一个默认的共享内存,然后通过setNativeKey()来指定一个本地key(native key),以这样的方式来实现和非Qt应用程序的互动。当使用native key之后,对于多次访问,共享内存将不会被保护(比如,无法去做lock()),而应该由用户自定义的机制来提供这种保护。

成员类型


enum QSharedMemory::AccessMode

常量                      值       描述
QSharedMemory::ReadOnly   0        这段共享内存是只读的。无法写入。一次写入尝试将使得程序abort. 
QSharedMemory::ReadWrite  1        既可读也可写。


enum QSharedMemory::SharedMemoryError



成员函数


QSharedMemory::QSharedMemory(const QString& key, QObject* parent=Q_NULLPTR)

通过指定的parent和key,构造一个共享内存对象。因为key已经被设置,create()和attach()就可以被调用了。


QSharedMemory::QSharedMemory(QObject* parent = Q_NULLPTR)

重载了QSharedMemory()
通过给定的parent,构造一个共享内存对象。因为共享内存对象的key没有被指定,所以共享内存对象并没有附着在一块底层的共享内存段上。key必须由setKey()或setNativeKey()再来指定了,然后才能使用create()或attach().

QSharedMemory::~QSharedMemory()

析构函数清除key,这将使得这个共享内存对象和其底层的共享内存段分离。如果这个共享内存对象是最后一个连接到此共享内存块的,那么detach()操作将销毁这段共享内存。

bool QSharedMemory::attach(AccessMode mode = ReadWrite)

试图将进程附着在通过key所标识的共享内存段上(key是由构造函数传递而来,或由调用setKey()或setNativeKey()而来)。默认情况下,access mode是ReadWrite. 也可改做ReadOnly. 如果附着动作成功,则返回true. 如果返回了false,可以调用error()来查明是由什么错误引起的。在附着到共享内存段之后,可以通过调用data()来获取指向这一段共享内存的指针。

const void * QSharedMemory::constData() const

返回一个const指针,指向共享内存段的内容,如果该共享内存段被附着了的话。否则,如果没有被附着,就返回null. 在读写这块共享内存之前要lock(),而在一切做完之后要记得用unlock()来解除对这段共享内存的锁定。

bool QSharedMemory::create(int size, AccessMode mode=ReadWrite)

当key由构造函数设定后,或者由setKey()或setNativeKey()设定之后,创建一个大小为size个字节的共享内存段。然后用给定的访问模式附着到共享内存上。最后返回true. 如果被key所标识的共享内存段早已存在,那么附着操作将不会被执行,并返回false. 当返回值为false的时候,可以调用error()来查看是由什么错误引起的。

void * QSharedMemory::data()

返回一个指针,指向的是该共享内存段的内容,如果该共享内存段被附着了的话。若没有被附着,则返回null. 在读写这块共享内存之前要lock(),而在一切做完之后要记得用unlock()来解除对这段共享内存的锁定。

const void * QSharedMemory::data() const

重载了data()

bool QSharedMemory::detach()

将进程和共享内存段分离。如果这个进程是最后一个附着在该共享内存段上的进程,那么该共享内存会被系统释放,即,内容会被销毁。如果分离成功,返回true. 如果返回false,那一般是因为或者根本没有附着在该共享内存段上,或者该共享内存段被其他进程lock住了。

SharedMemoryError QSharedMemory::error() const

返回一个值以指明是否有error发生,若有的话,那是什么error.

QString QSharedMemory::errorString() const

返回对上一次所发生的错误的文本描述。若error()返回的是一个error值,那么调用本函数将返回一个文本字符串以描述该错误。

bool QSharedMemory::isAttached() const

若进程已经附着在该共享内存上,则返回true. 

QString QSharedMemory::key() const

返回被setKey()所赋值的key,或者如果还没有key则返回null key,或者如果使用的是nativeKey(). key是Qt应用程序所使用的标识以用来区分不同的共享内存段。
可以通过调用nativeKey()来找到native的,平台相关的,被操作系统所使用的key. 

bool QSharedMemory::lock()

这是一个为了本进程的访问而锁住了共享内存段的信号量,锁住成功则返回true. 若另一个进程已经锁住了共享内存段,本函数将会阻塞直到锁被另一个进程释放。到那时,本函数才会获得锁并返回true. 如果本函数返回false,那就说明你已经忽略了一个由create()或attach()返回的false,而其原因可能是由于某个系统错误而导致setNativeKey()或QSystemSemaphore::acquire()失败。

QString QSharedMemory::nativeKey() const

返回本地的(native),平台相关的,代表此共享内存对象的key. 这个native key是一个被操作系统用来识别共享内存段的标识。
你可以使用此native key来访问不是被Qt创建的共享内存段,或给予非Qt应用程序访问此共享内存的权限。

void QSharedMemory::setKey(const QString& key)

为此共享内存对象设置平台无关的key. 如果key和当前的key一样,函数返回而不会做任何事。
你可以调用key()来取得此平台无关key. 在内部实现里,QSharedMemory将此key转换为一个平台相关key. 如果调用的是nativeKey(),就会直接得到平台相关的key,而无需转换。
如果共享内存对象附着到了底层的共享内存段上,那么在设置新key之前会先与现有的共享内存段。本函数并不做attach().

void QSharedMemory::setNativeKey(const QString& key)

设置本地的(native),平台相关的,代表此共享内存对象的key. 如果key是和当前native key相同,此函数返回,不做任何事情。如果所有你想做的只是将一个key设置到一块共享内存段上,你应该调用setKey().
你可以调用nativeKey()来获取native key. 如果一个native key已经被设置,调用key()将返回一个null string. 
如果共享内存对象附着到了底层的共享内存段上,在设置新key之前,它将与原先的共享内存段分离。本函数不做attach().
如果你设置native key,那么这个应用程序将是不可移植的。

int QSharedMemory::size() const

返回所附着的共享内存段的大小。如果没有共享内存段被附着,就会返回0. 

bool QSharedMemory::unlock()

释放在共享内存段上的锁并返回true,如果锁是被当前进程所持有的话。如果共享内存段没有被lock,或者如果锁被其他进程持有,本函数什么都不会做而只是返回false. 


(完)



你可能感兴趣的:(C++,QT)