Обработчик сигналов обращается к структуре данных очереди (состояние гонки?)

В настоящее время я пишу небольшую оболочку на C ++.

Задания и связанные с ними PID хранятся в очереди указателей заданий (job *) . При запуске нового задания информация о нем добавляется в очередь. Поскольку несколько заданий можно обрабатывать одновременно, а новые задания можно вводить в консоли оболочки в любое время, у меня есть обработчик сигналов для ожидания выполнения заданий, которые завершены.

Когда задание завершается, мне нужно удалить информацию о нем из активной очереди заданий и переместить ее в мою двухстороннюю очередь завершенных заданий. Однако возможно, что новое задание пользователя добавляется в очередь, когда останавливается другое задание.

В таком случае их операция очереди insert будет приостановлена, и будет вызван мой обработчик сигналов, который выполнит свою операцию pop .

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

Я вижу некоторую информацию о C ++ 11 , способном выполнять атомарные операции, объявленные пользователем, а также информацию о тасклетах. Я не уверен, имеют ли они отношение к моему вопросу.

Достаточно интересно, что пример оболочки (MSH - http://code.google.com/p/mini-shell-msh/ ), которую я использую в качестве справки, похоже, не выполняет никаких обработка таких условий. Обработчик сигналов немедленно изменяет список заданий вместе с главной консолью. Может быть, я что-то упускаю из виду?

Как всегда, все отзывы учитываются.

6
задан BSchlinker 16 November 2011 в 03:04
поделиться