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