std :: async를 사용해야하는 이유는 무엇입니까?
std :: async를 사용하고 정의를 읽는 동안 새로운 C ++ 11 표준의 모든 옵션을 자세히 살펴 보려고합니다. 최소한 gcc 4.8.1이 설치된 Linux에서 두 가지 사항을 발견했습니다.
- async 라고 부르지 만 기본적으로 비동기 함수 foo 와 관련된 future 를 호출하는 행에서 실제로 "순차적 동작" 이 있습니다 . 프로그램은 foo 실행이 완료 될 때까지 차단 됩니다.
- 그것은 다른 것들과 똑같은 외부 라이브러리와 더 나은 비 차단 솔루션에 의존합니다. 즉
pthread
, 사용std::async
하려면 pthread가 필요합니다.
이 시점에서 왜 단순한 펑터 세트보다 std :: async를 선택하는지 묻는 것이 당연합니다. 전혀 확장되지 않는 솔루션입니다. 앞으로 더 많이 전화할수록 프로그램의 응답 성이 떨어집니다.
내가 뭔가를 놓치고 있습니까? 비동기식, 비 차단 방식으로 실행되도록 허용 된 예제를 보여줄 수 있습니까?
비동기 작업의 결과를 필요로하는 경우에, 당신은 이 블록에 당신이 무엇을 사용 라이브러리에 상관없이. 차단할시기를 선택할 수 있고, 그렇게 할 때 모든 작업이 이미 완료 되었기 때문에 무시할 수있는 시간 동안 차단한다는 아이디어입니다.
참고 또한 std::async
정책을 실행할 수 있습니다 std::launch::async
또는 std::launch::deferred
. 지정하지 않으면 구현이 선택할 수 있으며 지연된 평가를 사용하도록 선택할 수 있습니다. 이로 인해 미래에서 결과를 얻으려고 할 때 모든 작업이 수행되어 블록이 더 길어집니다. . 따라서 작업이 비동기 적으로 수행되는지 확인하려면 std::launch::async
.
- 비동기라고하는데 정말 "순차적 동작"이 있습니다.
아니요, std::launch::async
정책을 사용하면 새 스레드에서 비동기 적으로 실행됩니다. 정책을 지정하지 않으면 새 스레드에서 실행될 수 있습니다 .
기본적으로 비동기 함수 foo와 관련된 future를 호출하는 행에서 프로그램은 foo 실행이 완료 될 때까지 차단됩니다.
foo가 완료되지 않은 경우에만 차단되지만 비동기 적으로 실행 된 경우 (예 : std::launch::async
정책 을 사용하기 때문에 ) 필요하기 전에 완료되었을 수 있습니다.
- 그것은 다른 것들과 똑같은 외부 라이브러리와 더 나은 비 차단 솔루션에 의존합니다. 즉, pthread를 의미합니다. std :: async를 사용하려면 pthread가 필요합니다.
틀 렸습니다. Pthread를 사용하여 구현할 필요가 없습니다 (Windows에서는 그렇지 않고 ConcRT 기능을 사용합니다).
이 시점에서 왜 단순한 펑터 세트보다 std :: async를 선택하는지 묻는 것이 당연합니다.
스레드 안전성을 보장하고 스레드간에 예외를 전파하기 때문입니다. 간단한 펑터 세트로 그렇게 할 수 있습니까?
전혀 확장되지 않는 솔루션입니다. 앞으로 더 많이 전화할수록 프로그램의 응답 성이 떨어집니다.
반드시 그런 것은 아닙니다. 시작 정책을 지정하지 않으면 스마트 구현이 새 스레드를 시작할지 지연된 함수를 반환할지 아니면 나중에 더 많은 리소스를 사용할 수 있는지 결정하는 것을 반환할지 여부를 결정할 수 있습니다.
이제 GCC의 구현에서 시작 정책을 제공하지 않으면 현재 릴리스에서 새 스레드에서 실행되지 않을 것입니다 ( 버그질라 보고서 가 있음).하지만 이는 std::async
일반적으로가 아니라 해당 구현의 속성입니다. . 표준의 사양을 특정 구현과 혼동해서는 안됩니다. 하나의 표준 라이브러리 구현을 읽는 것은 C ++ 11에 대해 배우는 데 좋지 않은 방법입니다.
비동기식, 비 차단 방식으로 실행되도록 허용 된 예제를 보여줄 수 있습니까?
차단해서는 안됩니다.
auto fut = std::async(std::launch::async, doSomethingThatTakesTenSeconds);
auto result1 = doSomethingThatTakesTwentySeconds();
auto result2 = fut.get();
시작 정책을 지정하여 비동기 실행을 강제 실행하고 실행 중에 다른 작업을 수행하면 필요할 때 결과가 준비됩니다.
나는 당신의 문제가 std::future
그것이 차단된다고 말하는 것이라고 생각합니다 get
. 결과가 아직 준비되지 않은 경우 에만 차단 됩니다 .
결과를 이미 준비 할 수 있다면 문제가되지 않습니다.
결과가 이미 준비되었음을 알 수있는 여러 가지 방법이 있습니다. 폴링 future
하고 질문 할 수 있습니다 (상대적으로 간단 함), 잠금 또는 원자 데이터를 사용하여 준비가되었다는 사실을 전달할 수 있습니다. 프레임 워크를 구축하여 future
소비자가 상호 작용할 수있는 대기열에 "완료된" 항목 을 전달할 수 있습니다. 어떤 종류의 신호를 사용할 수 있습니다 (한 번에 여러 가지를 차단하거나 폴링).
또는 로컬에서 수행 할 수있는 모든 작업을 완료 한 다음 원격 작업을 차단할 수 있습니다.
예를 들어 병렬 재귀 병합 정렬을 상상해보십시오. 배열을 두 개의 청크로 분할 한 다음 async
한 청크에서 정렬을 수행하고 다른 청크를 정렬합니다. 절반 정렬이 완료되면 원래 스레드는 두 번째 작업이 완료 될 때까지 진행할 수 없습니다. 그래서 그것은 a .get()
와 블록을합니다. 두 반쪽이 모두 정렬되면 병합을 수행 할 수 있습니다 (이론상 병합은 적어도 부분적으로 병렬로 수행 될 수도 있습니다).
이 작업은 외부에서 상호 작용하는 사람들에게 선형 작업처럼 작동합니다. 완료되면 배열이 정렬됩니다.
그런 다음 이것을 std::async
작업에 래핑 하고 future
정렬 된 배열을 가질 수 있습니다 . 원한다면 시그널 프로 시저를 추가하여 future
완료 되었음을 알릴 수 있지만, 시그널을 기다리는 스레드가있는 경우에만 의미가 있습니다.
에서 참조 : http://en.cppreference.com/w/cpp/thread/async
async 플래그가 설정되면 (예 : policy & std :: launch :: async! = 0), async는 std :: thread (f, args ...)에 의해 생성 된 것처럼 별도의 실행 스레드에서 함수 f를 실행합니다. 단 , 함수 f가 값을 반환하거나 예외를 throw하는 경우 비동기가 호출자에게 반환하는 std :: future를 통해 액세스 할 수있는 공유 상태에 저장 된다는 점을 제외하고는입니다 .
throw 된 예외 기록을 유지하는 것은 좋은 속성입니다.
http://www.cplusplus.com/reference/future/async/
세 가지 유형의 정책이 있습니다.
launch::async
launch::deferred
launch::async|launch::deferred
기본적으로 launch::async|launch::deferred
에 전달됩니다 std::async
.
참고 URL : https://stackoverflow.com/questions/17963172/why-should-i-use-stdasync
'Program Tip' 카테고리의 다른 글
MySql에 대한 샘플 MongoDB 데이터베이스가 전 세계에 있습니까? (0) | 2020.11.23 |
---|---|
Android에서 텍스트 편집에서 커서 위치를 얻습니까? (0) | 2020.11.23 |
UIWebView와 동일한 배율로 렌더링하기 위해 콘텐츠 크기 조정에서 WKWebView 억제 (0) | 2020.11.23 |
DataFrame을 Hive에 직접 저장하는 방법은 무엇입니까? (0) | 2020.11.23 |
디렉토리가 git 제어하에 있는지 확인 (0) | 2020.11.23 |