我有一个多线程应用程序,必须经常读取一些数据,偶尔会更新数据.现在,互斥锁可以保持对数据安全的访问,但是它很昂贵,因为我希望多个线程能够同时读取,并且只在需要更新时将其锁定(更新线程可以等待其他线程完成) .
我认为这是boost::shared_mutex应该做的,但我不清楚如何使用它,并没有找到一个明确的例子.
有没有人有一个我可以用来开始的简单例子?
这样做的pthread_mutex_lock和调用pthread_mutex_unlock函数调用的存储栅栏/屏障指令?或者像compare_and_swap暗示那样的低级指令是否有内存障碍?
我正在尝试在以下类型的共享内存中构建映射
我像这样创建共享内存区域:
managed_shared_memory segment(create_only ,"MyMap" ,size);
ShMemAllocator_t alloc_inst (segment.get_segment_manager());
map = segment.construct<MyMap_t>("MyMap")
(std::less<int>()
,alloc_inst);
Run Code Online (Sandbox Code Playgroud)
地图中的值如下:
typedef pair<MutexType, boost::interprocess::offset_ptr<void> > ValueType ;
Run Code Online (Sandbox Code Playgroud)
MutexType本身是一个包含read和write mutex的结构(使用read_lock和write_lock); 定义如下:
typedef struct mutex_struct{
sharable_lock<interprocess_mutex> read_lock(interprocess_mutex, defer_lock);
scoped_lock<interprocess_mutex> write_lock(interprocess_mutex, defer_lock);
} MutexType;
Run Code Online (Sandbox Code Playgroud)
"size"是映射的总大小(就对象而言,所有void指针指向的数据大小的总和).
如何确保此void*数据也位于我创建的此内存段中,如何在现有共享内存区域中实例化它.之所以这样做,这是我想只有只是反复一次分配这个大的缓冲区删除/添加对象到它(地图模型高速缓存),我还没有在其中找到多个对象可以在相同的内存段内被分配办法在地图内.此外,寻求分配MutexType对返回编译错误,指出没有提供"call"操作符.