Windows跨线程共享内存类

在Windows操作系统中,跨线程或进程共享内存是一项常见的需求。本文将介绍一个用于实现这一功能的类库,它提供了锁定机制、通知等功能。

类库使用说明

要使用这个类库,首先需要了解它的基本使用方法。以下是一些关键点的概述:

在C++中,类的实例化可以通过以下方式进行:

usm sm(L"{4BF41A4E-ACF9-4E1D-A479-14DE9FF83BC2}", false, 1000, 100);

其中,string_id是一个唯一标识内核对象的字符串,所有使用相同string_idusm实例都将访问相同的内存。建议使用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);

这个方法内部调用BeginReadEndRead方法。如果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);

这些方法允许在读取或写入操作完成时得到通知。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485