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

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

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

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

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

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

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

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

Как всегда, все отзывы оценены.

Ответы на вопрос(2)

Ваш ответ на вопрос