在Windows操作系统中,跨线程或进程共享内存是一项常见的需求。本文将介绍一个用于实现这一功能的类库,它提供了锁定机制、通知等功能。
要使用这个类库,首先需要了解它的基本使用方法。以下是一些关键点的概述:
在C++中,类的实例化可以通过以下方式进行:
usm sm(L"{4BF41A4E-ACF9-4E1D-A479-14DE9FF83BC2}", false, 1000, 100);
其中,string_id
是一个唯一标识内核对象的字符串,所有使用相同string_id
的usm
实例都将访问相同的内存。建议使用CLSID值以避免与其他应用程序的usm
实例发生冲突。如果传递0,则对象将保持未初始化状态。要初始化对象,必须调用CreateInit
方法,它接受与构造函数相同的参数。
类初始化是通过调用Initialize
方法完成的,该方法创建了同步所需的内核对象句柄。如果初始化成功,Initialize
返回1,出错则返回-1。如果Initialize
失败,End
方法会清理所有剩余的句柄。类的析构函数也会调用End
方法。
int Initialize();
如果另一个线程正在写入共享内存,Initialize
方法会等待直到写入完成。
读取共享内存可以通过以下方法:
unsigned long long ReadData(T* b, size_t sz, size_t offset = 0, bool FailIfNotReady = false);
这个方法内部调用BeginRead
和EndRead
方法。如果FailIfNotReady
为true,并且有线程正在写入,则该方法会立即返回-1。如果为false,则等待写入线程完成写入。
写入共享内存的方法如下:
unsigned long long WriteData(const T* b, size_t sz, size_t offset = 0, bool FailIfNotReady = false);
如果FailIfNotReady
为true,并且有其他线程正在写入或读取,则该方法会立即返回-1。如果为false,则等待其他写入或读取线程完成。
如果需要获取数据的指针,可以调用BeginRead
(必须随后调用EndRead
)和BeginWrite
(必须随后调用EndWrite
):
const T* BeginRead(bool FailOnNotReady = false);
void EndRead();
T* BeginWrite(bool FailOnNotReady = false);
void EndWrite();
类还提供了通知机制,可以通过以下方法实现:
DWORD NotifyOnRead(bool Wait);
DWORD NotifyWrite(bool Wait);
这些方法允许在读取或写入操作完成时得到通知。