C++11 중 std::async 사용 에 대한 자세 한 설명

8367 단어 C++11std::async
C++11 의 std::async 는 템 플 릿 함수 입 니 다.std::async 비동기 호출 함수 입 니 다.어느 때 Args 를 매개 변수(가 변 길이 매개 변수)로 Fn 을 호출 합 니 다.Fn 이 실 행 될 때 까지 기다 리 지 않 고 돌아 갈 수 있 습 니 다.결 과 는 std:future 대상 입 니 다.Fn 되 돌아 오 는 값 은 std::future 대상 의 get 구성원 함 수 를 통 해 얻 을 수 있 습 니 다.Fn 의 실행 이 완료 되면 공유 상 태 는 Fn 이 되 돌아 오 는 값 과 ready 를 포함 합 니 다.
std::async 는 두 가지 버 전이 있 습 니 다.
1.지정 한 시작 정책 을 표시 하지 않 고 자동 으로 선택 할 수 있 기 때문에 시작 정책 은 확실 하지 않 습 니 다.std:launch:async 일 수도 있 고 std:launch::deferred 일 수도 있 습 니 다.또는 이들 의 임 의 조합 은 시스템 과 특정 라 이브 러 리 의 실현 에 달 려 있 습 니 다.
2.호출 자가 특정한 시작 정책 을 선택 할 수 있 도록 합 니 다.
std::async 의 시작 정책 형식 은 다음 을 포함 하여 매 거 진 enum class launch 입 니 다.
1.std::launch:async:비동기,새로운 스 레 드 호출 Fn 을 시작 합 니 다.이 함 수 는 새 스 레 드 비동기 로 호출 되 고 공유 상태의 접근 점 과 동기 화 됩 니 다.
2.std::launch::deferred:지연,공유 상태 에 접근 할 때 이 함수 가 호출 됩 니 다.Fn 호출 은 되 돌아 오 는 std::future 의 공유 상태 에 접근 할 때(std:future 의 wait 또는 get 함수 사용)로 연 기 됩 니 다.
매개 변수 Fn:함수 포인터,구성원 포인터,모든 유형의 이동 가능 한 구조의 함수 대상(즉,클래스 가 operator()의 대상 을 정의 합 니 다).fn 의 반환 값 이나 이상 이 공유 상태 에 저장 되 어 비동기 std:future 대상 검색 을 제공 합 니 다.
매개 변수 Args:Fn 에 전 달 된 매개 변 수 는 이동 가능 한 구조 여야 합 니 다.
반환 값:fn 실행 이 끝 났 을 때 공유 상태의 std::future 대상 이 준비 되 었 습 니 다.std::future 의 구성원 함수 get 검색 값 은 Fn 이 되 돌려 주 는 값 입 니 다.시작 정책 이 std::launch::async 를 사용 할 때 공유 상태 에 접근 하지 않 더 라 도 돌아 오 는 std::future 는 생 성 된 스 레 드 의 끝 에 연 결 됩 니 다.이러한 상황 에서 std::future 의 분석 함수 와 Fn 의 반환 이 동기 화 됩 니 다.
std::future 소개 참고:https://www.jb51.net/article/179229.htm
상세 한 용법 은 아래 의 테스트 코드 를 볼 수 있 습 니 다.다음은 다른 글 에서 copy 의 테스트 코드 입 니 다.부분 은 조정 되 었 고 상세 한 내용 은 대응 하 는 reference 를 참고 할 수 있 습 니 다.

#include "future.hpp"
#include <iostream>
#include <future>
#include <chrono>
#include <utility>
#include <thread>
#include <functional>
#include <memory>
#include <exception> 
#include <numeric>
#include <vector>
#include <cmath>
#include <string>
#include <mutex>
 
namespace future_ {
 
///////////////////////////////////////////////////////////
// reference: http://www.cplusplus.com/reference/future/async/
int test_async_1()
{
 auto is_prime = [](int x) {
 std::cout << "Calculating. Please, wait...
"; for (int i = 2; i < x; ++i) if (x%i == 0) return false; return true; }; // call is_prime(313222313) asynchronously: std::future<bool> fut = std::async(is_prime, 313222313); std::cout << "Checking whether 313222313 is prime.
"; // ... bool ret = fut.get(); // waits for is_prime to return if (ret) std::cout << "It is prime!
"; else std::cout << "It is not prime.
"; return 0; } /////////////////////////////////////////////////////////// // reference: http://www.cplusplus.com/reference/future/launch/ int test_async_2() { auto print_ten = [](char c, int ms) { for (int i = 0; i < 10; ++i) { std::this_thread::sleep_for(std::chrono::milliseconds(ms)); std::cout << c; } }; std::cout << "with launch::async:
"; std::future<void> foo = std::async(std::launch::async, print_ten, '*', 100); std::future<void> bar = std::async(std::launch::async, print_ten, '@', 200); // async "get" (wait for foo and bar to be ready): foo.get(); // : , '*' bar.get(); std::cout << "

"; std::cout << "with launch::deferred:
"; foo = std::async(std::launch::deferred, print_ten, '*', 100); bar = std::async(std::launch::deferred, print_ten, '@', 200); // deferred "get" (perform the actual calls): foo.get(); // : , '**********' bar.get(); std::cout << '
'; return 0; } /////////////////////////////////////////////////////////// // reference: https://en.cppreference.com/w/cpp/thread/async std::mutex m; struct X { void foo(int i, const std::string& str) { std::lock_guard<std::mutex> lk(m); std::cout << str << ' ' << i << '
'; } void bar(const std::string& str) { std::lock_guard<std::mutex> lk(m); std::cout << str << '
'; } int operator()(int i) { std::lock_guard<std::mutex> lk(m); std::cout << i << '
'; return i + 10; } }; template <typename RandomIt> int parallel_sum(RandomIt beg, RandomIt end) { auto len = end - beg; if (len < 1000) return std::accumulate(beg, end, 0); RandomIt mid = beg + len / 2; auto handle = std::async(std::launch::async, parallel_sum<RandomIt>, mid, end); int sum = parallel_sum(beg, mid); return sum + handle.get(); } int test_async_3() { std::vector<int> v(10000, 1); std::cout << "The sum is " << parallel_sum(v.begin(), v.end()) << '
'; X x; // Calls (&x)->foo(42, "Hello") with default policy: // may print "Hello 42" concurrently or defer execution auto a1 = std::async(&X::foo, &x, 42, "Hello"); // Calls x.bar("world!") with deferred policy // prints "world!" when a2.get() or a2.wait() is called auto a2 = std::async(std::launch::deferred, &X::bar, x, "world!"); // Calls X()(43); with async policy // prints "43" concurrently auto a3 = std::async(std::launch::async, X(), 43); a2.wait(); // prints "world!" std::cout << a3.get() << '
'; // prints "53" return 0; } // if a1 is not done at this point, destructor of a1 prints "Hello 42" here /////////////////////////////////////////////////////////// // reference: https://thispointer.com/c11-multithreading-part-9-stdasync-tutorial-example/ int test_async_4() { using namespace std::chrono; auto fetchDataFromDB = [](std::string recvdData) { // Make sure that function takes 5 seconds to complete std::this_thread::sleep_for(seconds(5)); //Do stuff like creating DB Connection and fetching Data return "DB_" + recvdData; }; auto fetchDataFromFile = [](std::string recvdData) { // Make sure that function takes 5 seconds to complete std::this_thread::sleep_for(seconds(5)); //Do stuff like fetching Data File return "File_" + recvdData; }; // Get Start Time system_clock::time_point start = system_clock::now(); std::future<std::string> resultFromDB = std::async(std::launch::async, fetchDataFromDB, "Data"); //Fetch Data from File std::string fileData = fetchDataFromFile("Data"); //Fetch Data from DB // Will block till data is available in future<std::string> object. std::string dbData = resultFromDB.get(); // Get End Time auto end = system_clock::now(); auto diff = duration_cast <std::chrono::seconds> (end - start).count(); std::cout << "Total Time Taken = " << diff << " Seconds" << std::endl; //Combine The Data std::string data = dbData + " :: " + fileData; //Printing the combined Data std::cout << "Data = " << data << std::endl; return 0; } } // namespace future_
GitHub: https://github.com/fengbingchun/Messy_Test
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기