共享内存崩溃安全吗?
Is Shared memory crash safe?
我想以非常高效的方式在两个或多个进程之间共享数据。我正在使用 C++ 和 boost.Interprocess。以下是流程:
- 进程 A:创建共享内存,然后写入。
- 进程 B:Reader 从共享内存中读取
- 进程 C:与进程 B 相同
约束条件:
共享内存的大小事先未知,可能是 10kB 或 30MB。
进程 A 和 B 可以独立启动,因此进程 B 可以在进程 A 之前启动。
我希望尽可能避免崩溃,这意味着在 reader 进程崩溃的情况下,应用程序会继续...
SharedMem 中当前使用的代码(目前使用托管段):
struct MainStruct
{
MainStruct(const void_allocator& void_alloc)
:/* ... */
{
}
//Mutex to protect access to the data
mutex_type mutex;
//Condition to wait when new data is ready
condition_type cond_new_data;
//Condition to wait when data has been read by a reader
condition_type cond_data_read;
// More code ...
};
// Shared memory creation
m_sho = new bi::managed_shared_memory(bi::create_only, m_shared_memory_name.str(), size);
void_allocator alloc_inst(m_sho->get_segment_manager());
m_main_struct = m_sho->construct<MainStruct>("main")(alloc_inst);
m_data_struct = m_sho->construct<CharVector>("data")(alloc_inst);
我的问题:
- 如果使用共享内存的进程崩溃,是否可以假定一切正常并继续?可以锁定互斥锁,但可以通过 time_locked() 检测到它,然后强制解锁互斥锁。尝试修复内存有意义吗?还是赌博,我应该取消映射并重新映射?
- 了解我的项目的限制(开始时大小未知,防碰撞...),您是否有任何推荐的设计(如果可能,使用 Boost.Interprocess)
谢谢。
向 OS 请求 segment to share 并且在程序获得有效请求之前不要 运行 任何处理。初始化段将允许进程 B 知道进程 A 是否写入了不同的值。
除非你绝对确定进程B不会在进程A完成之前读取内存,否则synchronisation mechanisms是强制性的,这取决于你想要达到的目的,两个有用的用于是(但检查所有这些):
记住共享内存可以抛出,抓住它就可以了。
size不是问题,truncate
(withread_write)设置segment的大小:
When a shared memory object is created, its size is 0. To set the size of the shared memory, the user must use the truncate function call, in a shared memory that has been opened with read-write attributes
或者使用windows_shared_memory
的构造函数。
我想以非常高效的方式在两个或多个进程之间共享数据。我正在使用 C++ 和 boost.Interprocess。以下是流程:
- 进程 A:创建共享内存,然后写入。
- 进程 B:Reader 从共享内存中读取
- 进程 C:与进程 B 相同
约束条件: 共享内存的大小事先未知,可能是 10kB 或 30MB。 进程 A 和 B 可以独立启动,因此进程 B 可以在进程 A 之前启动。 我希望尽可能避免崩溃,这意味着在 reader 进程崩溃的情况下,应用程序会继续...
SharedMem 中当前使用的代码(目前使用托管段):
struct MainStruct
{
MainStruct(const void_allocator& void_alloc)
:/* ... */
{
}
//Mutex to protect access to the data
mutex_type mutex;
//Condition to wait when new data is ready
condition_type cond_new_data;
//Condition to wait when data has been read by a reader
condition_type cond_data_read;
// More code ...
};
// Shared memory creation
m_sho = new bi::managed_shared_memory(bi::create_only, m_shared_memory_name.str(), size);
void_allocator alloc_inst(m_sho->get_segment_manager());
m_main_struct = m_sho->construct<MainStruct>("main")(alloc_inst);
m_data_struct = m_sho->construct<CharVector>("data")(alloc_inst);
我的问题:
- 如果使用共享内存的进程崩溃,是否可以假定一切正常并继续?可以锁定互斥锁,但可以通过 time_locked() 检测到它,然后强制解锁互斥锁。尝试修复内存有意义吗?还是赌博,我应该取消映射并重新映射?
- 了解我的项目的限制(开始时大小未知,防碰撞...),您是否有任何推荐的设计(如果可能,使用 Boost.Interprocess)
谢谢。
向 OS 请求 segment to share 并且在程序获得有效请求之前不要 运行 任何处理。初始化段将允许进程 B 知道进程 A 是否写入了不同的值。
除非你绝对确定进程B不会在进程A完成之前读取内存,否则synchronisation mechanisms是强制性的,这取决于你想要达到的目的,两个有用的用于是(但检查所有这些):
记住共享内存可以抛出,抓住它就可以了。
size不是问题,truncate
(withread_write)设置segment的大小:
When a shared memory object is created, its size is 0. To set the size of the shared memory, the user must use the truncate function call, in a shared memory that has been opened with read-write attributes
或者使用windows_shared_memory
的构造函数。