Совместная память доставляет мне трудности, а 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 ()
.