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