비동기 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!