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

std::async()가 반환한 Future에 차단 소멸자가 있는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-20 15:43:12
원래의
989명이 탐색했습니다.

Why do Futures Returned by std::async() Have Blocking Destructors?

비동기 Future의 차단된 소멸자

미래가 std::async에서 반환되면 해당 소멸자가 암시적으로 차단되어 호출로 이어집니다. 스레드 일시 중지. 이 동작은 놀랍게 보일 수 있지만 안전과 정확성을 위해 의도된 것입니다.

소멸자를 차단하는 이유

Hans Boehm이 백서 "N3679: Async( ) 미래 소멸자는 기다려야 합니다." async()에 의해 반환된 미래는 관련 공유 상태가 소멸자에서 준비될 때까지 기다립니다. 이렇게 하면 future가 삭제된 후 완료될 때까지 기다릴 방법 없이 관련 스레드가 계속 실행되는 시나리오를 방지할 수 있습니다. 추가 조치가 없으면 이러한 "폭주" 스레드는 종속 개체의 수명 이상으로 확장되어 잠재적으로 스레드 간 "메모리 파괴" 및 보안 취약점을 일으킬 수 있습니다.

다음 코드 조각을 고려하세요.

std::future<int> future = std::async(std::launch::async, run_async_task);
로그인 후 복사

미래의 소멸자가 다음과 같은 경우 차단하지 않으면 run_async_task를 실행하는 스레드는 future가 삭제된 후에도 계속 실행될 수 있습니다. 이 스레드가 이미 삭제된 개체에 액세스하면 런타임 오류가 발생합니다.

대체 접근 방식

차단 동작을 방지하려면 future.get()을 명시적으로 호출하세요. 또는 미래를 파괴하기 전에 future.wait(). 이를 통해 관련 작업이 완료되고 더 이상 파괴된 미래에 의존하지 않게 됩니다.

업데이트

2013년 9월 C 표준 회의 이후 Michael Wong의 "Trip Report" 이 주제에 대한 업데이트된 관점을 제공합니다. 중요한 논의가 있었지만 std::future 소멸자의 차단 동작은 변경되지 않았습니다. 또한 비동기 사용을 중단하자는 제안도 최종적으로 거부되었습니다.

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

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