Действия очереди в разделяемой памяти

Совместная память доставляет мне трудности, а GDB - нет. не особо помог. У меня выделено 32 КБ общей памяти, и я использовал shmat , чтобы преобразовать его в указатель на struct , содержащую A) a bool и B) a очередь объектов, содержащих один std :: string , три int и один bool , а также различные методы. (Я не знаю, подходит ли вам эта структура матрешки, но это единственный способ, который я знаю. Использование очереди сообщений не вариант, и мне нужно использовать несколько процессов.)

Помещение одного объекта в очередь работает, но когда я пытаюсь вставить второй, программа зависает. Ни сообщения об ошибке, ничего. Что вызывает это? Я сомневаюсь, что это недостаток памяти, но если это так, то сколько мне нужно?

РЕДАКТИРОВАТЬ: На случай, если я не понял - объекты в очереди относятся к классу с пятью описанными членами данных.

РЕДАКТИРОВАТЬ 2: Я изменил класс записей очереди, чтобы он не использовал std :: string . (Как ни странно, мне удалось представить данные с помощью примитива.) Программа все еще зависает при втором нажатии push ().

РЕДАКТИРОВАТЬ 3: Я попытался вызвать front () из той же очереди сразу после первого push () , и он заморозил программу тоже.Однако проверка значения bool вне очереди работала нормально, так что что-то не так с самой очередью.

РЕДАКТИРОВАТЬ 4: В качестве эксперимента я добавил std :: queue в структуру , которую я использовал для разделяемой памяти. Он показал то же поведение - push () сработал один раз, затем front () заставил его «зависнуть». Так что это не проблема и с классом, который я использую для элементов очереди.

Этот вопрос предполагает, что я вряд ли решу эту проблему с помощью std :: queue . Это так? Должен ли я использовать наддув , как написано? (В моем случае я выполняю shmget () и shmat () в родительском процессе и пытаюсь разрешить двум дочерним процессам взаимодействовать, поэтому это немного отличается.)

РЕДАКТИРОВАТЬ 5: Другой дочерний процесс также зависает, когда он вызывает front () . Семафор гарантирует, что это произойдет после первого вызова push () .

0
задан Community 23 May 2017 в 11:44
поделиться