std::thread์™€ std::async

2023. 1. 14. 23:52ยทํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/C++ ์‘์šฉ

 

 

โœ… ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ 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  (1) 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
'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/C++ ์‘์šฉ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [STL] utility : minmax, move, forward, swap
  • vcpkg๋ฅผ ์“ฐ์ž
  • [std] iterator๋ณด๋‹จ const_iterator !
  • ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ์†Œ๊ด„ํ˜ธ์™€ ์ค‘๊ด„ํ˜ธ ์ฐจ์ด
์„œ์•„๋ž‘๐Ÿ˜ƒ
์„œ์•„๋ž‘๐Ÿ˜ƒ
Just Do It๐Ÿ’ช
  • ์„œ์•„๋ž‘๐Ÿ˜ƒ
    G-Stack
    ์„œ์•„๋ž‘๐Ÿ˜ƒ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์ „์ฒด๋ณด๊ธฐ (144)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (78)
        • C++ ๊ธฐ์ดˆ (28)
        • C++ ์‘์šฉ (18)
        • Python (18)
        • JavaScript & NodeJS (0)
        • Go (12)
        • React & NextJS (2)
        • Java (0)
      • AI (2)
      • ์ปดํ“จํ„ฐ ๊ตฌ์กฐ & ์šด์˜์ฒด์ œ (31)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (12)
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (5)
      • ๋„คํŠธ์›Œํฌ (3)
      • ๋””์ž์ธํŒจํ„ด (5)
      • ์„œ๋น„์Šค & ํˆด (7)
      • ํŠธ๋ Œ๋“œ&์ด์Šˆ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

    • G์Šคํƒ์˜ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    STD
    ๋ฐฐ์—ด
    c++
    ์กฐ๊ฑด๋ฌธ
    RAM
    go
    ์žฌ๊ท€
    ํฌ์ธํ„ฐ
    ๋ฉ”๋ชจ๋ฆฌ
    ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ
    ์ปดํ“จํ„ฐ
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ๋””์ž์ธํŒจํ„ด
    ์ƒ์†
    ์Šคํƒ
    init
    c
    ํ•˜๋“œ๋””์Šคํฌ
    ํŒจํ‚ค์ง€
    component
    ํŒŒ์ผ์ž…์ถœ๋ ฅ
    ํŒŒ์ด์ฌ
    ๋ฐ˜๋ณต๋ฌธ
    ๋ณ€์ˆ˜
    Thread
    fork
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    pointer
    cpu
    ํ•จ์ˆ˜
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
์„œ์•„๋ž‘๐Ÿ˜ƒ
std::thread์™€ std::async
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”