And*_*nga 5 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
}
};
Run Code Online (Sandbox Code Playgroud)
我在boost网站上就如何做到这一点的阅读表明可能存在僵局.事实上,这就是为什么我将ctor放入私有部分并使构建器功能:因此,在构造期间,可以删除先前的实例.但是,这并没有缓解这个问题.
我尝试更改共享内存段的名称,以便它不会被使用,但是,当进入这些代码行时,进程会挂起.
我正在为我的模型使用此链接(以及来自同一文档站点的其他链接).在这一点上,我需要第二组眼睛,最好是那些有经验的增强进程间和共享内存的眼睛.
顺便说一下,我从我提供的链接中使用的程序模型是"命名共享内存"程序.令人恼火的是,我已将该程序复制到我的Linux系统上,构建并运行它没有任何问题.我错过了什么?
谢谢你的帮助,安迪
目前,该问题似乎与与 boost无关的问题有关。我提出了这个问题,并如此标记它,因为当我第一次遇到这个问题时,这正是发生挂断的地方。我认为挂起是由于深埋在 boost 库中用于进程间通信的互斥锁的阻塞请求造成的。我相信我拥有的代码构造,将 ctor 设为私有并调用工厂函数,已经缓解了这个问题。
感谢 Brian 的精彩建议,我很快就发现了问题所在。本例中的问题是,当打开我之前创建的 fifo 时,非阻塞选项未添加到标志中,并且进程正在阻塞等待另一方打开同一管道进行写入。