Общая память доставляет мне неприятности, и GDB не сильно помогает. У меня выделено 32 КБ общей памяти, и я использовал shmat
для приведения ее к указателю на struct
, содержащую A) a bool
и B) очередь объектов, содержащих одну std::string
, три int
s и один bool
, плюс разные методы. (Я не знаю, должна ли эта структура matryoshka, как вы должны это делать, но это единственный способ, который я знаю. Использование очереди сообщений не вариант, и мне нужно использовать несколько процессов.)
Нажатие одного объекта в очередь работает, но когда я пытаюсь нажать второй, программа зависает. Нет сообщения об ошибке, нет ничего. Что вызывает это? Я сомневаюсь, что это нехватка памяти, но если это так, сколько мне нужно?
РЕДАКТИРОВАТЬ: В случае, если мне было неясно - объекты в очереди относятся к классу с пятью описанными членами данных.
РЕДАКТИРОВАТЬ 2: Я изменил класс записей очереди, чтобы он не использовал std::string
. (Довольно неловко, я смог представить данные примитивом.) Программа все еще зависает при втором нажатии ().
РЕДАКТИРОВАТЬ 3: Я пытался вызвать front()
из той же очереди сразу после первой push()
, и it также заморозило программу. Однако проверка значения bool
за пределами очереди работала нормально, поэтому с самой очередью должно быть что-то не так.
РЕДАКТИРОВАТЬ 4: В качестве эксперимента я добавил std::queue<int>
к struct
, который я использовал для общей памяти. Он показал то же самое поведение - push()
работал один раз, затем front()
заставляло его зависать. Так что это не проблема с классом, который я использую для элементов очереди.
Этот вопрос предполагает, что я вряд ли смогу решить эту проблему с помощью std::queue
. Это так? Должен ли я использовать boost
, как написано? (В моем случае я выполняю shmget()
и shmat()
в родительском процессе и пытаюсь позволить двум дочерним процессам взаимодействовать, так что это немного отличается.)
РЕДАКТИРОВАТЬ 5: Другой дочерний процесс также останавливается при вызове front()
. Семафор гарантирует, что это произойдет после первого push()
вызова.