- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
刚刚开始使用 boost 库并熟悉它以找到解决我的问题的方法。
我试图解决的问题是无法在共享内存 (CreateFileMapping) 中的 Windows 上使用 STL 容器的限制。
我找不到使用 boost 中的 windows_shared_memory 共享 vector 的单个示例。但是有很多例子like this使用 managed_shared_memory。
请告知这是否可行并提供一个示例,当然许多其他开发人员对此感兴趣并会从中受益匪浅。
最佳答案
下面的片段是一个更大的项目的摘录,我实际上已经解决了这个问题。由于它只是片段,我可能会有一些不匹配。但我试图概述一般过程。
文档基本上都可以在boost文档中找到。但是它很简洁,并且只有两个关于托管共享内存的小示例。
通过这种方法,我什至能够在 64 位和 32 位进程之间共享 vector 和映射。它在字符串上失败,然后我将其交换为字符 vector 。
首先是命名空间:
namespace bipc = boost::interprocess;
namespace bc = boost::container;
typedef bipc::managed_windows_shared_memory managed_shm_type;
typedef bipc::managed_shared_memory managed_shm_type;
offset_ptr
的定义它定义了内存对齐:
typedef bipc::basic_managed_windows_shared_memory
< char
, bipc::rbtree_best_fit
<
bipc::mutex_family,
bipc::offset_ptr<void, int64_t, uint64_t> // defines the "alignment"
>
, bipc::iset_index
> managed_shm_type;
typedef managed_shm_type::segment_manager segment_manager_t;
typedef bc::scoped_allocator_adaptor<bipc::allocator<void, segment_manager_t> > void_allocator;
typedef void_allocator::rebind<char>::other char_allocator;
typedef bc::vector<char, char_allocator> char_vector;
typedef bc::basic_string
<
char,
std::char_traits<char>,
char_allocator
> char_string;
typedef void_allocator::rebind<char_string>::other string_allocator;
typedef bipc::offset_ptr<void, int64_t, uint64_t> data_ptr;
typedef void_allocator::rebind<data_ptr>::other data_ptr_allocator;
typedef bc::vector<data_ptr, data_ptr_allocator> data_vector;
typedef void_allocator::rebind<int32_t>::other int_allocator;
typedef bc::vector<int32_t, int_allocator> int_vector;
typedef bc::vector<char_string, string_allocator> string_vector;
typedef std::pair<const SEGMENTID, uint32_t> segid_type;
typedef bipc::allocator<segid_type, segment_manager_t> segid_type_allocator;
typedef bc::map
<
SEGMENTID,
uint32_t,
std::less<SEGMENTID>,
segid_type_allocator
> segid_map;
// first get the shared memory segment
global_segment = std::make_unique<managed_shm_type>(bipc::create_only,
shmem_name.c_str(),
200000 );
// struct that is going to be allocated in shared memory
struct global_sharedMemory_data
{
explicit global_sharedMemory_data(const char_allocator & void_alloc)
: declutter(50, false, void_alloc)
, core_queue_name(void_alloc)
, remote_queue_counter(0)
, segment_id_map(void_alloc)
{}
int_vector declutter;
char_string core_queue_name;
uint32_t remote_queue_counter;
segid_map segment_id_map;
};
global_sharedMemory_data * globalShMem;
void_allocator alloc_inst (global_segment->get_segment_manager());
globalShMem = global_segment->construct<global_sharedMemory_data>
("Name of Shared Object")(alloc_inst);
// write a string to shared memory
globalShMem->core_queue_name = "Alcatraz";
关于c++ - 是否可以使用 boost windows_shared_memory 共享 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59303386/
我目前正在查看 Boost 的进程间库的文档,并试图找出其中的区别。 据我所知,唯一的区别是持久性(windows 共享内存在最后一个进程退出时被释放,managed_shm 仅在被告知时才被释放),
刚刚开始使用 boost 库并熟悉它以找到解决我的问题的方法。 我试图解决的问题是无法在共享内存 (CreateFileMapping) 中的 Windows 上使用 STL 容器的限制。 我找不到使
您好,我需要在 Linux 上构建一个项目,但它使用“boost/interprocess/windows_shared_memory.hpp”有什么方法可以在 linux 上运行它,或者我必须重写这
我之前问过一个 boost-interprocess 的问题,并发誓我会停止使用它,但是,唉,我被卡住了,我真的需要这个东西来工作。所以我仍在与之抗争。 我在分配然后立即销毁 boost::inter
Boost 提供了几种类型的共享内存。其中,windows_shared_memory 使用 Windows 自己的底层共享内存功能,因此是平台特定的,与其他共享内存(POSIX 兼容内存)相比具有一
我是一名优秀的程序员,十分优秀!