โ ์ค๋ ๋ ๊ธฐ๋ฐ ์ ๊ทผ vs ๊ณผ์ ๊ธฐ๋ฐ ์ ๊ทผ
work๋ผ๋ ํจ์๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง ์ ๋๋ค. ํ๋๋ std::thread ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๊ทธ ๊ฐ์ฒด์์ work๋ฅผ ์คํํ๋ ๊ฒ์ด๊ณ , ์ด๋ ์ค๋ ๋ ๊ธฐ๋ฐ(thread-based) ํ๋ก๊ทธ๋๋ฐ์ ํด๋นํฉ๋๋ค. ๋ ํ๋๋ work๋ฅผ std::async์ ๋๊ฒจ์ฃผ๋ ๊ฒ์ด๊ณ ์ด๋ ๊ณผ์ ๊ธฐ๋ฐ(task-based) ํ๋ก๊ทธ๋๋ฐ์ ํด๋นํฉ๋๋ค.
int work();
std::thread t(work);
auto f = std::async(work);
์ ์ฝ๋๋ฅผ ์ง๊ด์ ์ผ๋ก ๋ณด์์ ๋, async๋ฅผ ์ฐ๋ฉด work์ ๋ฐํ ๊ฐ์ ์ป์ ์ ์๋ค๋ ๊ฒ์ด ๋ณด์ ๋๋ค.(std::get์ ํตํด ์ป์ ์ ์์ต๋๋ค)(thread๋ ํจ์์ ๋ฐํ ๊ฐ์ ์ป์ ์ ์์ต๋๋ค.)
์ด๊ฒ ๋ฟ๋ง ์๋๋ผ ๋์ฒด๋ก ๊ณผ์ ๊ธฐ๋ฐ ์ ๊ทผ๋ฐฉ์์ด ์ค๋ ๋ ๊ธฐ๋ฐ ์ ๊ทผ๋ฐฉ์๋ณด๋ค ์ฐ์ํฉ๋๋ค.
๊ณผ์ ๊ธฐ๋ฐ ์ ๊ทผ๋ฐฉ์์ ์ข ๋ ๋์ ์์ค์ ์ถ์์ ์ฒดํํ๋ค๋ ์ ์ ๋๋ค. ๋๋ถ์ ํ๋ก๊ทธ๋๋จธ๋ ์ธ๋ถ์ ์ธ ์ค๋ ๋ ๊ด๋ฆฌ์์ ๋ฒ์ด๋ ์ ์์ต๋๋ค. ์ข ๋ ์์ธํ ๋งํ๋ฉด ๊ณผ์ ๊ธฐ๋ฐ ์ ๊ทผ๋ฐฉ์์ ํ๋์จ์ด ์์์ ์ด์ฉํ์ฌ ์๋์ผ๋ก ์ค๋ ๋ํ์ ๊ด๋ฆฌํด์ ์ค๋ ๋๋ฅผ ํ ๋นํ๋ ๊ธฐ๋ฅ์ด ๋ค์ด๊ฐ ์๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๋ ๋จ์ง async๋ง ์ฌ์ฉํ๋ฉด ๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ง์ฝ, ํ๋์จ์ด ์ค๋ ๋๋ณด๋ค ๋ ๋ง์ ์ค๋ ๋๋ฅผ ๋ง๋๋ ค๊ณ ํ๋ฉด ์ด๋จ๊ฒ ๋ ๊น์?
์ค๋ ๋ ๊ธฐ๋ฐ ์ ๊ทผ๋ฐฉ์์ ๊ฒฐ๊ณผ๋ฅผ ์ฅ๋ดํ ์ ์์ต๋๋ค. exception์ด ๋ฐ์ํ๋ฉด์ ๊ผด๊น๋ฅ ํ ์๋ ์์ต๋๋ค. ํ์ง๋ง ๊ณผ์ ๊ธฐ๋ฐ ์ ๊ทผ๋ฐฉ์์ ์ค๋ ๋ ๊ด๋ฆฌ์ ์ฑ ์์ C++ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌํ์์๊ฒ ๋๊ธด๋ค. ๋ด๋ถ์ ์ผ๋ก๋ ์์ธ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ์ค๋ ๋๋ฅผ ์์ฑํ์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฐ๋ฆฌ๋ ์ฒ๋ฆฌ๋์ง ์์ ์์ธ๋ฅผ ๋ฐ๋ค๊ฐ ํ๋ก๊ทธ๋จ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒ ๋ณด๋จ ์ค๋ ๋ ํ๋ ๋ ๋ง๋๋ ๊ฒ์ด ํจ์ฌ ๋ ์ด๋์ผ ๊ฒ์ ๋๋ค.
โ ๋น๋๊ธฐ๊ฐ ํ์์ธ ๊ฒฝ์ฐ์๋ std::launch::async
auto f = std::async(work);
auto f2 = std::async(std::launch::async | std::launch::deferred, work);
std::async์๋ ๋ช ๊ฐ์ง ์์ฑ์๊ฐ ์์ต๋๋ค. ์ ์ฝ๋์ฒ๋ผ ๋น๋๊ธฐ๋ฅผ ์คํ์ํฌ ํจ์๋ง ๋ฃ์ด์ฃผ๋ ์์ฑ์๋ ์๊ณ , ์คํ ๋ฐฉ์นจ์ ์ง์ ํ ์ ์์ต๋๋ค.
์คํ ๋ฐฉ์นจ์๋ std::launch::async, std::launch::deferred ๋ฑ์ด ์๋๋ฐ, ๋น๋๊ธฐ๋ฅผ ์คํ์ํค๊ธฐ ์ํด์๋ std::launch::async๋ฅผ ์ง์ ํฉ๋๋ค.
ํ์ง๋ง ๋ง์ ์ฌ๋๋ค์ด ํจ์๋ง ๋ฃ๋ ์ธ์๊ฐ 1๊ฐ์ธ ์์ฑ์๋ง ํธ์ถํด๋ ๋น๋๊ธฐ๋ฅผ ์คํ์ํฌ ์ ์๋ค๊ณ ๋งํ์ง๋ง, ์คํ ๋ฐฉ์นจ์ ์ง์ ํ์ง ์์ผ๋ฉด std::launch::async์ std::launch::deferred์ OR๋ก ๊ฒฐํฉํ ๋ฐฉ์นจ์ด ์ ์ฉํฉ๋๋ค.
์ฆ, ํจ์๋ง ์ธ์๋ก ๋ค์ด๊ฐ๋ std::async๋ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋ ์๋ ์๊ณ ์ ๋ ์๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋น๋๊ธฐ๋ฅผ ์คํ์ํค๋ ๊ฒ ๋ถ๋ช ํ๋ค๋ฉด, std::launch::async๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํด ์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ถ์ฒ: Effective Modern C++
'ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > C++ ์์ฉ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[STL] utility : minmax, move, forward, swap (0) | 2023.06.04 |
---|---|
vcpkg๋ฅผ ์ฐ์ (0) | 2023.03.19 |
[std] iterator๋ณด๋จ const_iterator ! (0) | 2023.01.14 |
๊ฐ์ฒด ์์ฑ์ ์๊ดํธ์ ์ค๊ดํธ ์ฐจ์ด (0) | 2023.01.14 |
[C++]ํฌ์ธํฐ์ ๋ ํผ๋ฐ์ค ์ฐจ์ด (0) | 2023.01.09 |
๋๊ธ