C++11 중 std::async 사용 에 대한 자세 한 설명
8367 단어 C++11std::async
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 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
어디서나 먹을 수있는 C++ 소프트웨어 엔지니어가되기 위해아래의 책은 숙독하자. 테스트 리팩토링, 좋은 설계란 무엇인가를 배울 수 있습니다. 임베디드 분야의 예를 사용하고 있습니다만, 임베디드를 하지 않는 사람이라도 도움이 되는 내용입니다. C/C++ 언어의 어려운 점은 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.