차단하는 이유: std::async
비동기 작업으로 작업할 때 소멸자는 std::async에 의해 반환된 future는 차단 동작으로 유명하며 그 필요성에 대한 의문이 제기됩니다. 이 디자인 선택을 자세히 알아보기 위해 구현으로 이어진 우려 사항과 논의를 살펴보겠습니다.
Herb Sutter의 논문 "async, ~future, and ~thread"에서는 차단 소멸자와 관련된 안전 고려 사항을 강조합니다. 이 동작이 없으면 future와 관련된 "런어웨이" 스레드는 관련 상태가 삭제된 후에도 계속 실행될 수 있습니다. 작업 완료에 대한 이러한 제어 부족은 잠재적으로 메모리 손상이나 기타 예상치 못한 문제로 이어질 수 있습니다.
Hans Boehm의 논문 "Async() future 소멸자는 기다려야 합니다"는 이러한 우려에 대한 구체적인 예를 제공합니다. 소멸자를 차단하지 않으면 예외 처리 또는 외부 이벤트로 인해 예상되는 작업 실행 흐름이 중단될 수 있습니다. Boehm이 지적했듯이 이는 공격자가 범위 가드의 감독을 악용하기 위해 예외의 타이밍을 조작하여 스택 덮어쓰기 및 프로세스 하이재킹으로 이어질 수 있는 보안 취약점을 생성할 수 있습니다.
차단 소멸자는 다음을 방지하는 역할을 합니다. 이러한 잠재적인 위험으로 인해 future가 삭제된 후 관련 스레드가 계속 실행되는 것을 방지합니다. 그러나 이 동작은 비동기 시작 정책을 사용하여 std::async에서 반환된 future에만 적용된다는 점에 유의하는 것이 중요합니다. std::promise 또는 병렬 알고리즘의 future에 의해 반환된 future와 같은 다른 future는 소멸자에서 동일한 차단 동작을 나타내지 않습니다.
안전성 문제가 제기되었음에도 불구하고 std::async future의 차단 소멸자는 이는 C 표준화 위원회 내에서 지속적인 논쟁의 주제였습니다. 차단 동작을 더 이상 사용하지 않거나 비동기 future에 대한 비표준으로 만들기 위해 제안된 변경 사항은 수용되지 않았습니다.
요약하자면, std::async가 반환한 future의 차단 소멸자는 안전 문제로 인한 논란의 여지가 있는 설계 선택입니다. . 제어되지 않은 스레드 실행과 관련된 잠재적인 문제를 방지하는 동시에 적절한 정리를 보장하기 위해 스레드 수명 주기 및 범위 가드를 명시적으로 관리해야 할 필요성도 소개합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3