【问题标题】:Struggling to get boost shared memory segments to construct努力获得提升共享内存段来构建
【发布时间】:2013-04-18 15:27:39
【问题描述】:

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

#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 放入私有部分并创建 builder 函数的原因:这样,在构建过程中,可以删除以前的实例。然而,这并没有缓解问题。

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

我正在为我的模型使用这个link(以及来自同一文档站点的其他人)。在这一点上,我需要第二双眼睛,最好是那些有经验的提升进程间和共享内存的眼睛。

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

感谢您的帮助, 安迪

【问题讨论】:

  • 调试器挂起时的堆栈回溯会有所帮助。
  • @brianbeuning 您的建议帮助我找到了真正的罪魁祸首。谢谢。我已经有一段时间没有使用 gdb 了。把吸水扒放在一边几天真是太好了。
  • 我在开发过程中遇到了类似的症状,我创建了一个 managed_shared_memory 对象而没有调用destroy和remove,后来我添加了它,但是我创建的shared_memory_object仍然有某种互斥锁或信号量,所以我 rm -rf /dev/shm 并重新开始,这对我有帮助。

标签: c++ boost boost-thread


【解决方案1】:

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

多亏了布赖恩的好建议,我才能够及时发现问题所在。这种情况下的问题是,当打开我之前创建的 fifo 时,非阻塞选项没有被或'ed 到标志中,并且进程正在阻塞等待另一方打开相同的管道进行写入。

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2012-10-19
    相关资源
    最近更新 更多