努力获得提升共享内存段来构建

时间:2013-04-18 15:27:39

标签: c++ boost boost-thread

我有一些代码,我正在尝试创建共享内存段。为此,该段由一个类内部进行管理。共享段将以“公告板”的方式使用。也就是说,这一个进程将写入它,许多其他进程将从中读取。没有进一步的麻烦:

#include <string>
#include <sys/types.h>
#include <boost/interprocess/managed_shared_memory.hpp>

static const std::string SHM_NAME("SharedMemory");
static const std::string SHM_STATUS("StatusArray");
static const std::string SHM_INFO1("MfgData");

class Manager {
    u_int8_t* _status;
    char* _info;

    boost::interprocess::managed_shared_memory _shm;

    Manager()
        : _shm(boost::interprocess::create_only, SHM_NAME.c_str(), 1024)
    {
        // the process goes out to lunch on this first call, it's like a deadlock
        status = _shm.construct<u_int8_t>(SHM_STATUS.c_str()) [128] (0); // array 128 bytes, init to 0
        info = _shm.construct<char>(SHM_INFO1.c_str()) [256] (0);
    }

public:
    ~Manager() {
        _shm.destroy<u_int8_t>(SHM_STATUS.c_str());
        _shm.destroy<char>(SHM_INFO1.c_str());
        boost::interprocess::managed_shared_memory_object::remove(SHM_NAME.c_str());
    }

    Manager* Builder() {
        // just in case a previous instance was abnormally terminated
        boost::interprocess::managed_shared_memory_object::remove(SHM_NAME.c_str());
        return new Manager(); // sort of a factory pattern
    }
};

我在boost网站上就如何做到这一点的阅读表明可能存在僵局。事实上,这就是为什么我将ctor放入私有部分并使构建器功能:因此,在构造期间,可以删除先前的实例。但是,这并没有缓解这个问题。

我尝试更改共享内存段的名称,以便它不会被使用,但是,当进入这些代码行时,进程会挂起。

我正在使用此link(以及来自同一文档网站的其他人)作为我的模型。在这一点上,我需要第二组眼睛,最好是那些经验丰富的增强进程间和共享内存的眼睛。

顺便说一句,我从我提供的链接中使用的程序模型是“命名共享内存”程序。令人恼火的是,我已将该程序复制到我的Linux系统上,构建并运行它没有任何问题。我错过了什么?

感谢您的帮助, 安迪

1 个答案:

答案 0 :(得分:1)

问题似乎与此时与提升相关的有关。我问了这个问题,并对其进行了标记,因为当我第一次遇到问题时,这正是挂断发生的地方。我认为挂断是由于一个互斥锁的阻塞请求深埋在升级库中,用于进程间通信。我相信我拥有的代码构造,将ctor私有化并调用工厂函数,已经缓解了这个问题。

感谢Brian的好建议,我能够在问题出现的时刻看到。在这种情况下的问题是,当打开我之前提到的fifo时,非阻塞的选项没有被或者进入标志,并且进程阻止等待另一方打开相同的管道进行写入。 / p>