В настоящее время я пишу небольшую оболочку на C ++.
Задания и связанные с ними PID хранятся в очереди указателей заданий (job *)
. При запуске нового задания информация о нем добавляется в очередь. Поскольку несколько заданий можно обрабатывать одновременно, а новые задания можно вводить в консоли оболочки в любое время, у меня есть обработчик сигналов для ожидания выполнения заданий, которые завершены.
Когда задание завершается, мне нужно удалить информацию о нем из активной очереди заданий и переместить ее в мою двухстороннюю очередь завершенных заданий. Однако возможно, что новое задание пользователя добавляется в очередь, когда останавливается другое задание.
В таком случае их операция очереди insert
будет приостановлена, и будет вызван мой обработчик сигналов, который выполнит свою операцию pop
.
Я пытаюсь понять, как я могу разрешить это потенциальное состояние гонки, поскольку я предполагаю, что во время этого процесса может произойти повреждение. Я не могу использовать мьютекс, поскольку возникнет тупик, если прерванный родительский процесс будет использовать очередь в то время.
Я вижу некоторую информацию о C ++ 11
, способном выполнять атомарные операции, объявленные пользователем, а также информацию о тасклетах. Я не уверен, имеют ли они отношение к моему вопросу.
Достаточно интересно, что пример оболочки (MSH - http://code.google.com/p/mini-shell-msh/ ), которую я использую в качестве справки, похоже, не выполняет никаких обработка таких условий. Обработчик сигналов немедленно изменяет список заданий вместе с главной консолью. Может быть, я что-то упускаю из виду?
Как всегда, все отзывы учитываются.