共享内存崩溃安全吗?

Is Shared memory crash safe?

我想以非常高效的方式在两个或多个进程之间共享数据。我正在使用 C++ 和 boost.Interprocess。以下是流程:

约束条件: 共享内存的大小事先未知,可能是 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);

我的问题:

谢谢。

向 OS 请求 segment to share 并且在程序获得有效请求之前不要 运行 任何处理。初始化段将允许进程 B 知道进程 A 是否写入了不同的值。

除非你绝对确定进程B不会在进程A完成之前读取内存,否则synchronisation mechanisms是强制性的,这取决于你想要达到的目的,两个有用的用于是(但检查所有这些):

  • Semaphore:进程B必须等到进程A写入一些数据
  • Mutex (and associated condition): 进程 B 可以随时读取,除了进程 A 正在写入的同时(因为你获得了资源)

记住共享内存可以抛出,抓住它就可以了。 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的构造函数。