묻공러
[게임서버 섹션2 Note] Future
묻공러
묻지마공부
묻공러
전체
오늘
어제
  • 분류 전체보기 (521) N
    • C (54)
      • [코드조선] C 핵심 (35)
      • [언어본색] C 기초 (19)
    • C++ (72)
      • [루키스] C++ (9)
      • [루키스] 콜백함수 (6)
      • [루키스] STL (8)
      • [루키스] Modern C++ (11)
      • [노코프] C++ (10)
      • [노코프] Tips (16)
      • [일지] C++ (12)
    • C# (20) N
      • [루키스] C# (9)
      • [루키스] 자료구조 (3)
      • [루키스] 실전 문법 (8) N
    • 자료구조 & 알고리즘 (50)
      • [코드조선] C 자료구조 & 알고리즘 (6)
      • [합격자되기] C++ 코딩테스트 (12)
      • [루키스] C++ 자료구조 & 알고리즘 (32)
    • CS (69)
      • [널널한 개발자] CS 개론 (19)
      • [혼자 공부하는] 컴퓨터 구조 (16)
      • [혼자 공부하는] 운영체제 (18)
      • [널널한 개발자] 네트워크 (16)
    • 게임 그래픽스 (46)
      • [전북대] OpenGL (25)
      • [일지] DirectX (21)
    • 게임 엔진 - 언리얼 (123)
      • [코드조선] 언리얼 (53)
      • [코드조선] 언리얼 데디서버 (8)
      • [일지] 언리얼 (59)
      • [일지] 언리얼 (2) (3)
    • 게임 엔진 - 유니티 (14) N
      • [최적화] 유니티 (4)
      • [루키스] 유니티 (10) N
    • 게임 서버 (17)
    • 게임 수학 & 물리 (19)
      • 게임 수학 (12)
      • 게임 물리 (7)
    • GIT & GITHUB (4)
    • 영어 (18)
      • [The Outfit] 대본 공부 (11)
      • the others (7)
    • 그 외 (14)
      • In (5)
      • Out (5)
      • Review (4)

인기 글

최근 글

hELLO · Designed By 정상우.
게임 서버

[게임서버 섹션2 Note] Future

2024. 12. 30. 06:39

Future

계속 사용해야 하는 Event는 CV를 활용하면 되지만

단발성 Event인 경우는 CV를 사용하기엔 너무 과하다

thread를 만들고 cv변수를 만들고 

해당 변수의 멀티스레드에서 활용되면 lock도 관리해주어야 한다 

따라서

간단하게 사용하기 위해 Future가 도입되었다

 

Future 예시

#include <future>

int64 Calculate()
{
	int64 sum = 0;

	for (int32 i = 0; i < 100'000; i++)
	{
		sum += i;
	}
	
	return sum;
}

int main()
{
	//// 동기(synchronous) 실행
	//int sum = Calculate();
	//cout << sum << endl;

	// std::future
	{
		std::future<int64> future1 = std::async(std::launch::deferred, Calculate);
		std::future<int64> future2 = std::async(std::launch::async, Calculate);

		int64 sum1 = future1.get();
		int64 sum2 = future2.get();
	}
}

 

위의 코드에서 async의 첫번째 인자에

deferred는 스레드를 활용하는 것은 아니고 그냥 지연실행을 시킨다

async는 스레드 하나를 생성해 해당 스레드에게 실행을 시킨다

 

객체 대상의 Future

전역, static 말고도 객체 대상의 멤버 함수도 아래와 같이 실행시킬 수 있다 

class Knight
{
public:
	int64 GetHp() { return 100; }
};

Knight knight;
std::future<int64> future = std::async(std::launch::async, &Knight::GetHp, knight);


현업에서의 Future

게임의 데이터 파일을 로딩하는 경우

너무 많은 시간이 걸리기 때문에

future를 통해 단발적인 멀티스레드 작업을 진행하는 경우도 있다


Future의 wait, wait_for, get

wait는 무한정 기다리는 것이기에 get이랑 큰 차이가 없다
그래서 wait_for, get 만 기억을 하면 되는데

wait_for은 특정 시간 동안 기다리는 것으로 현재 진행 상태를 확인 가능하다

get은 그 결과를 받아오는 것으로

만약, 아직 결과를 받아올 수 없는 진행상태라면

해당 작업이 끝날 때까지 기다렸다가 결과를 받아온다

std::future<int64> future = std::async(std::launch::async, Calculate);

std::future_status status = future.wait_for(1ms);
if (status == future_status::ready)
{
	// TODO
}

//future.wait();

int64 sum = future.get();

 

 

Future 만드는 다른 방법

1) async

위에서 사용한 async 방식은

원하는 함수를 비동기적으로 실행을 했었다

 

2) promise

결과물을 promise를 통해 future로 받아준다

future를 이용해 단발성 Event를 만들 때,

만약 스레드 간 통신을 하며
전역변수를 만들어야 하는데 이러한 경우에는

굳이 전역변수를 만들 필요없이 promise를 이용하면 된다

 

참고로 
promise는 오른값으로 move가 되면서 소유권을 잃게 되고
future.get()은 한번 호출하면 소유권을 잃게 된다

 

3) packaged_task

원하는 함수의 실행 결과를 packaged_task를 통해 future로 받아준다

특정 함수를 진행하는 단발성 스레드를 만들어 처리하는 기존 방식들과는 달리

스레드를 만든 다음에 task를 여러 개 건네줄 수도 있다

 

#include <future>

int64 Calculate()
{
	int64 sum = 0;

	for (int32 i = 0; i < 100'000; i++)
	{
		sum += i;
	}

	return sum;
}

void PromiseWorker(std::promise<string>&& promise)
{
	promise.set_value("Secret Message");
}

void TaskWorker(std::packaged_task<int64(void)> && task)
{
	task();
}

int main()
{
	// std::promise
	{
		std::promise<string> promise;
		std::future<string> future = promise.get_future();

		thread t(PromiseWorker, std::move(promise));

		string messeage = future.get();

		t.join();

	}

	// std::packaged_task
	{
		std::packaged_task<int64(void)> task(Calculate);
		std::future<int64> future = task.get_future();

		std::thread t(TaskWorker, std::move(task));

		int64 sum = future.get();

		t.join();
	}
}
저작자표시 비영리 변경금지 (새창열림)

'게임 서버' 카테고리의 다른 글

[게임서버 섹션2 Note] CPU 파이프라인  (0) 2024.12.30
[게임서버 섹션2 Note] 캐시  (1) 2024.12.30
[게임서버 섹션2 Note] Condition Variable  (0) 2024.12.30
[게임서버 섹션2 Note] Event  (1) 2024.12.30
[게임서버 섹션2 Note] Sleep  (0) 2024.12.29
'게임 서버' 카테고리의 다른 글
  • [게임서버 섹션2 Note] CPU 파이프라인
  • [게임서버 섹션2 Note] 캐시
  • [게임서버 섹션2 Note] Condition Variable
  • [게임서버 섹션2 Note] Event
묻공러
묻공러
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.