async 를 실행할대 인자는 대표적으로 두개가 있다
Specifies the launch policy for a task executed by the std::async function.
std::launch is an enumeration used as BitmaskType.
The following constants denoting individual bits are defined by the standard library:
Constant | Explanation |
std::launch::async | the task is executed on a different thread, potentially by creating and launching it first |
std::launch::deferred | the task is executed on the calling thread the first time its result is requested (lazy evaluation) |
thread 를 굳이 만들지 않고 lock_guard 나 간편하게 비동기로 처리 하고 싶을 때 사용 할 수 있다
ex) 파일 로딩..
- std::future 쓰레드 만들때 좀 더 간단한 방식으로 만드는 형태, 간단하게 쓰일 때 유용
- calculate 를 async 방식으로 호출 하는 것
- 대표적으론 두가지 혼합해서 한가지 총 3가지 방식이 있다
- std::launch::deffered : 지연된 연산(lazy evaluation)인데 지연해서 실행해라 라는 얘기
get() 를 만날때 실행된다 - std::launch::async : 별도의 스레드를 만들어서 실행하라는 것
실제 스레드 개수가 늘어나는것을 Thread 창에서 확인 할수 있다
스레드를 별도로 만들지 않아도 내부적으로 알아서 만들어서 비동기로 실행함 ex) 데이터 파일 로딩시..
get() 함수를 통해 join 같은효과를 낼 수 있으며 결과 값을 반환 받을 수 있다 - std::launch::deffered | std::launch::async : 둘 중에 아무거나 골라서 실행 하라는 것
- std::launch::deffered : 지연된 연산(lazy evaluation)인데 지연해서 실행해라 라는 얘기
#include "pch.h"
#include <iostream>
#include "CorePch.h"
#include <thread>
#include <mutex>
#include "AccountManager.h"
#include "UserManager.h"
#include <chrono>
#include <future>
#include "windows.h"
using namespace std;
int64 calculate()
{
int64 sum = 0;
for (int32 i = 0; i < 100'000; ++i)
{
sum += 1;
}
return sum;
}
int main()
{
{
//std::future 쓰레드 만들때 좀 더 간단한 방식으로 만드는 형태, 간단하게 쓰일 때 유용
//calculate 를 async 방식으로 호출 하는 것
/*
* std::launch::deffered : 지연된 연산(lazy evaluation)인데 지연해서 실행해라 라는 얘기
std::launch::async : 별도의 스레드를 만들어서 실행하라는 것
std::launch::deffered | std::launch::async : 둘 중에 아무거나 골라서 실행 하라는 것
*/
//실제 스레드 개수가 늘어나는것을 Thread 창에서 확인 할수 있다
//스레드를 별도로 만들지 않아도 내부적으로 알아서 만들어서 비동기로 실행함 ex) 데이터 파일 로딩시..
std::future<int64> future = std::async(std::launch::async, calculate); //비 동기 호출, calculate 가 호출 됨
//이후에 다른 코드를 작성하다가
//시간이 지나서 해당 결과를 필요할대 꺼내 올 수 있다
int64 sum = future.get(); //get 을 만나면 이때까지 스레드가 실행 안됐다면 대기했다가 결과 반환
std::future<int64> futureDef = std::async(std::launch::deferred, calculate); //이건 스레드가 아니고 나중에 호출 하겠다는 얘기임
//실제 스레드 개수가 늘어나지 않는 다는 것을 Thread 창에서 확인 할 수 있다
int64 sum2 = futureDef.get(); //이때 실행 됨
}
return 0;
}
반응형
'운영체제 & 병렬처리 > Multithread' 카테고리의 다른 글
Cache (1) - 존재하는 이유와 성능 차이 (0) | 2022.09.11 |
---|---|
future , async, promise, packaged_task (2) (0) | 2022.09.11 |
condition_variable 예제 (Produce, Consumer) (0) | 2022.09.11 |
Conditional Variable - basic (0) | 2022.09.10 |
Event (이벤트) 순서 제어, WaitForSingleObject (0) | 2022.09.09 |