Почему блокируется: причины блокировки деструкторов фьючерсов, возвращаемых std::async
При работе с асинхронными задачами деструктор будущее, возвращаемое std::async, отличается своим блокирующим поведением, что вызывает вопросы о его необходимости. Чтобы углубиться в этот выбор дизайна, давайте рассмотрим проблемы и дискуссии, которые привели к его реализации.
В статье Херба Саттера «async, ~future и ~thread» освещаются соображения безопасности, связанные с блокировкой деструкторов. Без такого поведения «убегающий» поток, связанный с будущим, мог бы продолжить выполнение после того, как связанное с ним состояние было уничтожено. Отсутствие контроля над выполнением задач потенциально может привести к повреждению памяти или другим неожиданным проблемам.
Документ Ханса Бёма «Будущие деструкторы Async() должны ждать» представляет собой конкретный пример этой проблемы. Без блокировки деструкторов обработка исключений или внешние события могут нарушить ожидаемый поток выполнения задачи. Как указывает Бём, это может создать уязвимость безопасности, из-за которой злоумышленник может манипулировать временем возникновения исключений, чтобы воспользоваться недосмотром в средствах защиты области, что приведет к перезаписи стека и перехвату процессов.
Блокирующий деструктор служит защитой от эти потенциальные опасности, препятствующие продолжению выполнения связанного потока после уничтожения Future. Однако важно отметить, что такое поведение характерно для фьючерсов, возвращаемых std::async с политикой асинхронного запуска. Другие фьючерсы, например, возвращаемые std::promise или фьючерсы из параллельных алгоритмов, не демонстрируют такое же блокирующее поведение в своих деструкторах.
Несмотря на поднятые проблемы безопасности, блокирующий деструктор std::async фьючерсов был темой постоянных дебатов в комитете по стандартизации C. Предлагаемые изменения, направленные на то, чтобы отказаться от поведения блокировки или сделать его нестандартным для асинхронных фьючерсов, не были приняты.
Подводя итог, можно сказать, что блокирующие деструкторы фьючерсов, возвращаемые std::async, представляют собой спорный выбор конструкции, обусловленный соображениями безопасности. . Хотя это предотвращает потенциальные проблемы, связанные с неконтролируемым выполнением потоков, оно также вводит необходимость явного управления жизненным циклом потока и защитой области для обеспечения надлежащей очистки.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3