> 백엔드 개발 > C++ > 본문

`std::async`에 의해 반환된 `std::future` 소멸자가 차단되는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-15 14:26:02
원래의
874명이 탐색했습니다.

Why Does the `std::future` Destructor Returned by `std::async` Block?

std::async가 반환한 std::future 소멸자의 차단 특성

작업을 비동기식으로 시작하려고 하던 중 다음이 발견되었습니다. std::async에서 반환된 std::future의 소멸자는 차단 동작을 나타냅니다. 이로 인해 이 디자인 결정의 근거와 편의성과 효율성을 위해 개선할 수 있는지에 대한 의문이 제기되었습니다.

소멸자 차단에 대한 주장

차단 소멸자는 "폭주" 스레드를 방지합니다. 연결된 스레드가 완료될 때까지 기다리지 않고 std::future가 삭제되면 예측할 수 없는 동작과 잠재적인 메모리 손상이 발생할 수 있습니다.

Hans Boehm의 논문(N3679)에 설명된 대로 이 문제는 다음과 같은 경우에 발생할 수 있습니다. 스레드는 이미 파괴된 데이터에 대해 작동합니다. 차단 소멸자가 없으면 스레드가 해당 데이터에 계속 액세스하고 수정하여 스레드 간 메모리 문제가 발생할 수 있습니다.

대체 접근 방식

일부에서는 다음과 같이 제안했습니다. 결과를 검색하거나 완료를 기다리기 위해 get 또는 wait 메소드가 항상 호출되는 경우 비차단 소멸자만으로도 충분합니다. 그러나 Boehm은 명시적인 호출에 의존하는 것은 감독하기 쉽고 보안 취약성을 초래할 수 있다고 주장합니다. 실행 중 예외와 같은 예외적인 상황에서는 이러한 호출을 우회하여 폭주 스레드가 생성될 수 있습니다.

현재 상태 및 향후 개발

내부에서 지속적인 논의가 이루어지고 있음에도 불구하고 C 표준 위원회에서는 C 14에서 std::future 소멸자의 차단 동작에 대한 변경 계획이 없습니다. 그러나 이 문제는 여전히 고려 중이며 향후 C 버전에서는 이 동작을 해결할 수도 있습니다.

연습 권장 사항

차단 소멸자와 관련된 잠재적인 문제를 피하려면 std::async에서 반환된 std::future를 삭제하기 전에 항상 get 또는 wait를 호출하는 것이 좋습니다. 이렇게 하면 관련 스레드가 실행을 완료하고 필요한 모든 리소스가 해제되었는지 확인할 수 있습니다.

위 내용은 `std::async`에 의해 반환된 `std::future` 소멸자가 차단되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿