@Baalskra

Может ли прерывание прервать выполнение конструктора / деструктора в С++?

Пишу для встраиваемых систем на С++, и возник вопрос - нужно ли в конструкторах / деструкторах защищать код критическими секциями?
  • Вопрос задан
  • 187 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Может ли прерывание прервать выполнение конструктора / деструктора в С++?

Да, конечно может, как и любой другой код, явно не защищённый от прерываний.

нужно ли в конструкторах / деструкторах защищать код критическими секциями?

Нужно защищать любое состояние, к которому может обращаться код из разных контекстов выполнения -- например из разных потоков или из потока и обработчика прерывания. В ядре linux (где разных типов контекста много и разных способов синхронизации тоже много) есть руководство, что и когда использовать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@dima20155
you don't choose c++. It chooses you
Что произойдет, если конструктор будет прерван?
При возникновении исключения прерываться может любой код (кроме critical section, внутри которой отключены прерывания). Если начнется выполнение, после обработки исключения, другой задачи, а не той, которая находилась в процессе создания объекта что будет? Если это не разделяемый между задачами ресурс, то подобный код не сможет упасть.

Важный вопрос, который вы захотите задать себе при добавлении критических секций: как часто будут отключаться прерывания? Как изменится отклик системы (особенно, если это система жёсткого реального времени)? Критическими секциями пользуются для изменения, например, мьютексов, поскольку они априори разделяемый ресурс и вызовут ошибку (например, дедлок) без подобной синхронизации. То есть если ваш объект представляет собой разделяемый ресурс, причем именно до момента создания (например, указатель на объект и процесс выделения памяти и создания объекта разделены во времени и могут быть прерваны) в таком случае синхронизация обязательна, но это исключительная ситуация, которую можно просто оборачивать в мьютексы, а не критические секции. Также хорошей практикой будет подготовить все, что возможно в момент инициализации, когда устройство ещё не приступило к работе и отклик системы не имеет значение

P.S. примеры основаны концепциях и понятиях систем реального времени лишь для удобства.
Ответ написан
Комментировать
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Да, может. Но обычно в самих конструкторах о многопоточном доступе не беспокоятся, потому что пока конструктор выполняется - объекта еще нет и никакой конкурентный доступ к нему невозможен. Если конструктор обращается к каким-то другим ресурсам, то вот те ресурсы должны защищаться от многопоточных проблем как обычно - не важно из конструктора к ним обращаются или из какого-то другого метода какого-то класса.
Ответ написан
Комментировать
@vanyamba-electronics
В обработчике прерывания стоит разместить установку флага, что прерывание произошло. А саму логику события поместить в общий поток обработки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы