Безопасно ли использовать `std :: shared_ptr` и` std :: weak_ptr` в обработчике сигналов?

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

Но если я могу гарантировать, что хотя бы одна общая ссылка останется в живых, тогда безопасно ли копировать-конструировать и уничтожать дополнительные общие или слабые ссылки, или мне нужно выполнить мой собственный пересчет?

(Да, я знаю обработчики сигналов обычно не должен делать много. Но на этот раз у меня есть веская причина.)

3

Решение

Стандарт C ++ определяет концепцию «простой старой функции» следующим образом:

POF («простая старая функция») — это функция, которая использует только функции из общего подмножества [C / C ++] и которая прямо или косвенно не использует какую-либо функцию, которая не является POF, за исключением того, что она может использовать обычную блокировку. бесплатные атомные операции.

Более того:

Поведение любой функции, кроме POF, используемой в качестве обработчика сигнала в программе на C ++, определяется реализацией.

Очевидно, что объекты класса C ++ не являются частью общего подмножества C / C ++, и поэтому их использование в обработчике сигналов приводит к поведению, определяемому реализацией.

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

Тогда все weak_ptr конструкторы явно объявлены noexcept, Поэтому они не могут бросать исключения. Это также означает, что им не разрешается выделять память (так как отказ выделить память вызовет исключение). Да, они могли бы выделить память и std::terminate если это не удастся, но это будет очень грубо для реализации.

копия&переместить конструкторы shared_ptr аналогично noexceptТо же самое относится и к. Это также верно для конструктора псевдонимов для shared_ptr,

Если ты абсолютно уверен что хотя бы один shared_ptr будет существовать, а затем уничтожить shared_ptr явно указано, чтобы не иметь побочных эффектов. Что, вероятно, включает в себя освобождение памяти.

Это те гарантии, которые дает вам стандартная библиотека.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]