본문 바로가기

메모장/C++

[c++] async 테스트

#include <iostream>
#include <vector>
#include <future>
#include <cstdio>

void for_print(int num) {
	// std::this_thread::sleep_for(std::chrono::seconds(1));
	for (int i = 0; i < 100; i++)
		fprintf(stderr, "%d번 Thread : %d\n", num, i);
}

int main() {
	for (size_t i = 0; i < 100; i++)
		std::async(std::launch::async, for_print, i);

	return 0;
}

멀티쓰레드로 실행되지 않음. (하나씩 동기 실행됨)

 

int main() {
	for (size_t i = 0; i < 100; i++)
		std::future<void> f = std::async(std::launch::async, for_print, i);

	return 0;
}

멀티쓰레드로 실행되지 않음. (하나씩 동기 실행됨)

 

int main() {
	std::vector<std::future<void>> v_async;
	v_async.reserve(100);

	for (size_t i = 0; i < 100; i++)
		v_async.emplace_back(std::async(std::launch::async, for_print, i));

	return 0;
}

비동기로 실행됨. (멀티 쓰레드)

 

int main() {
	std::future<void> f[100];
	for (size_t i = 0; i < 100; i++)
		f[i] = std::async(std::launch::async, for_print, i);

	return 0;
}

비동기로 실행됨. (멀티 쓰레드)

async의 반환값인 future 객체의 생명주기와 비동기 실행에 연관성이 있는 것으로 보임.

생명주기가 끝나면서 wait 하는것으로 예상. (소멸자 호출 -> wait)

 

int i =0;
void test()
{
	std::this_thread::sleep_for(std::chrono::seconds(3));
	printf("%d\n",i++);
}

int main()
{
	auto a = std::async(std::launch::async, test);
	auto b = std::async(std::launch::async, test);
	auto c = std::async(std::launch::async, test);
	std::async(std::launch::async, test);
}

실행 시간 3초 (0,1,2,3 동시 출력)

int main()
{
	auto a = std::async(std::launch::async, test);
	auto b = std::async(std::launch::async, test);
	std::async(std::launch::async, test);
	std::async(std::launch::async, test);
}

실행시간 6초 (0,1,2 출력 -> 3출력)

int main()
{
	{
	auto a = std::async(std::launch::async, test);
	auto b = std::async(std::launch::async, test);
	}
	std::async(std::launch::async, test);
	std::async(std::launch::async, test);
}

실행시간 9초 (0,1 출력 -> 2 출력 ->3출력)

std::future<void> a,b;
int main()
{
	{
	a = std::async(std::launch::async, test);
	b = std::async(std::launch::async, test);
	}
	std::async(std::launch::async, test);
	std::async(std::launch::async, test);
}

실행시간 6초 (0,1,2 출력 -> 3출력)