共享内存给我一个很难的时间,GDB没有太大的帮助。我已经分配了32KB共享内存,并且我使用shmat
将其转换为指向包含A)a bool
和B)包含一个std::string
,3个int
s和一个bool
的对象队列以及各种方法的指针struct
。 (我不知道这个俄罗斯套娃结构是如何做到的,但这是我知道的唯一方法。使用消息队列不是一种选择,我需要使用多个进程。)队列共享内存代理
将一个对象推到队列上工作,但是当我尝试推一秒时,程序冻结。没有错误信息,没有任何东西。这是什么造成的?我怀疑这是缺乏记忆,但如果是这样,我需要多少?
编辑:如果我不清楚 - 队列中的对象是一个类与五个数据成员描述。
编辑2:我改变了队列条目的类别,以便它不使用std::string
。 (令人尴尬的是,我能够用原语表示数据。)该程序在第二次push()时仍然冻结。
编辑3:我尝试的第一个push()
后会立即调用同一个队列front()
,并它冻结的程序了。检查 以外的值但是,该队列工作正常,所以它必须在队列本身出现问题。
EDIT 4:作为一个实验,我添加了一个std::queue<int>
到struct
我使用的共享存储器。它表现出相同的行为 - push()
曾经工作过,然后front()
冻结。所以对于我用于队列项目的类也不是问题。
This问题建议我不可能用std::queue
来解决这个问题。是这样吗?我应该使用boost
吗? (在我的情况,我在父进程执行shmget()
和shmat()
,并试图让两个子进程进行通信,所以它的略有不同。)
编辑5:当它调用front()
其他子进程也冻结。信号量确保在第一次调用push()
之后发生这种情况。
其中是分配了“std :: string”的内存?我打赌两个便士,那就是你的问题所在。 – Nim
我们可以看到再现症状的最小,完整的代码吗?我们不知道如何在共享内存上放置'std :: queue',如何使用信号灯等等。 – pilcrow