【发布时间】:2011-12-12 23:43:42
【问题描述】:
共享内存让我很难过,而 GDB 并没有多大帮助。我分配了 32KB 共享内存,我使用 shmat 将其转换为指向 struct 的指针,其中包含 A)bool 和 B)包含一个 std::string、三个 @987654326 的对象队列@s 和一个 bool,以及各种方法。 (我不知道这个套娃结构是不是你应该这样做,但这是我知道的唯一方法。使用消息队列不是一个选项,我需要使用多个进程。)
将一个对象推入队列是可行的,但是当我尝试推第二个对象时,程序会冻结。没有错误信息,什么都没有。这是什么原因造成的?我怀疑是内存不足,但如果是,我需要多少?
编辑:如果我不清楚 - 队列中的对象属于具有所描述的五个数据成员的类。
编辑 2: 我更改了队列条目的类,使其不使用 std::string。 (很尴尬的是,我能够用一个原语来表示数据。)程序仍然在第二次 push() 时冻结。
编辑 3:我尝试在第一个 push() 之后立即从同一个队列中调用 front(),并且 它 也冻结了程序。但是,检查队列外部的bool 的值工作正常,所以肯定是队列本身有问题。
编辑 4: 作为实验,我在用于共享内存的 struct 中添加了一个 std::queue<int>。它表现出相同的行为——push() 工作了一次,然后front() 让它冻结。所以我用于队列项目的类也不是问题。
This 问题表明我不太可能用std::queue 解决这个问题。是这样吗?我应该像它说的那样使用boost吗? (就我而言,我在父进程中执行shmget() 和shmat() 并试图让两个子进程进行通信,因此略有不同。)
编辑 5: 另一个子进程在调用 front() 时也会冻结。信号量确保在第一次 push() 调用之后发生这种情况。
【问题讨论】:
-
std::string的内存分配在哪里?我赌两便士,这就是你的问题所在。 -
我们可以看到重现症状的最小、完整的代码吗?我们不知道您如何将
std::queue放在共享内存上,如何使用信号量等。
标签: c++ gcc gdb ipc shared-memory