Sha*_*Guy 0 c++ gcc gdb ipc shared-memory
共享内存给我带来了困难,GDB没有太多帮助.我已经分配了32KB的共享内存,并且我曾经shmat将它转换为指向struct包含A)a bool和B的对象的队列,包含一个std::string,三个ints和一个对象的队列bool,以及各种方法.(我不知道这个俄罗斯套娃结构是否应该如何做,但这是我所知道的唯一方法.使用消息队列不是一种选择,我需要使用多个进程.)
将一个对象推入队列可以正常工作,但是当我尝试推送一个对象时,程序会冻结.没有错误消息,没有任何消息.是什么导致了这个?我怀疑这是缺乏记忆,但如果是,我需要多少钱?
编辑:如果我不清楚 - 队列中的对象是一个类,其中描述了五个数据成员.
编辑2:我更改了队列的条目类,以便它不使用std::string.(令人尴尬的是,我能够用原语表示数据.)程序仍然在第二次推送()时冻结.
编辑3:我尝试front()在第一个队列之后立即从同一个队列中调用push(),它也冻结了程序.但是,检查队列bool 外部的值是否正常,因此队列本身有问题.
EDIT 4:作为实验,我加入std::queue<int>到struct我使用的共享存储器.它显示了相同的行为 - push()工作一次,然后front()冻结.所以我用于队列项的类也不是问题.
这个问题表明我不太可能解决这个问题std::queue.是这样吗?我应该boost像它说的那样使用吗?(就我而言,我正在执行shmget()并shmat()在父进程中尝试让两个子进程进行通信,因此它略有不同.)
编辑5:其他子进程在调用时也会冻结front().信号量确保在第一次push()调用后发生这种情况.
将std::string对象放入共享内存段是不可能的.
它应该适用于单个进程,但是一旦你尝试从第二个进程访问它,你就会得到垃圾:字符串将包含指向堆分配数据的指针,并且该指针仅在进程中有效分配它.
我不知道为什么你的程序会冻结,但即使考虑也完全没有意义.