๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
C++ ๊ธฐ์ดˆ

[C++] 20. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Multi-Threads)

by ์„œ์•„๋ž‘๐Ÿ˜ 2023. 8. 18.

 

 

 

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ(Multi-Threads)

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‹คํ–‰ ํ๋ฆ„์ธ ์Šค๋ ˆ๋“œ(thread)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ "๋ถ€๋ถ„ ์ž‘์—…"์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜์—ฌ ์ „์ฒด ์ž‘์—…์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ฃผ์š” ๊ฐœ๋…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

1. ์Šค๋ ˆ๋“œ (Thread): ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ, ๋™์‹œ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋ณ‘๋ ฌ์„ฑ (Concurrency): ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜์ง€๋งŒ, ์‹ค์ œ๋กœ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ ํ”„๋กœ์„ธ์„œ์˜ ๋ฌผ๋ฆฌ์  ํ•œ๊ณ„ ๋•Œ๋ฌธ์— ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๊ฒน์ณ์„œ ์‹คํ–‰๋˜๋Š” ๊ฐœ๋…์„ ๋ณ‘๋ ฌ์„ฑ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

3. ๋™๊ธฐํ™” (Synchronization): ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜(์˜ˆ: ๋ฎคํ…์Šค, ์„ธ๋งˆํฌ์–ด, condition variable ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ๊ฒฝ์Ÿ ์ƒํƒœ (Race Condition): ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ๊ฒฝ์Ÿ ์ƒํƒœ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ๋™๊ธฐํ™” ์—†์ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๊ฒฝ์Ÿ ์ƒํƒœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์žฅ์ ์€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ํ–ฅ์ƒ: ์ž‘์—…์„ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ์ „์ฒด ์ž‘์—…์„ ๋” ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ: ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋ฏ€๋กœ, ํ•œ ์ž‘์—…์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ์ž์› ํ™œ์šฉ: ๋ฉ€ํ‹ฐ์ฝ”์–ด ํ”„๋กœ์„ธ์„œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‘๋‹ต์„ฑ ํ–ฅ์ƒ: ๋ณ‘๋ ฌ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์‘๋‹ต์„ฑ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋™๊ธฐํ™”์™€ ๊ฒฝ์Ÿ ์ƒํƒœ ๋ฌธ์ œ, ๋””๋ฒ„๊น…์˜ ์–ด๋ ค์›€ ๋“ฑ์˜ ์–ด๋ ค์›€๋„ ๋™๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ์•ˆ์ „ํ•œ ์ƒํ˜ธ์ž‘์šฉ์„ ๋ณด์žฅํ•˜๊ณ  ๋ณ‘๋ ฌ ์‹คํ–‰์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์˜ ๊นŠ๊ฒŒ ์„ค๊ณ„์™€ ๊ตฌํ˜„์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค๋Š” ๋ชจ๋‘ ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์˜ ์ผ์ข…์œผ๋กœ, ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ, ๊ทธ ์‹คํ–‰ ๋ฐฉ์‹๊ณผ ํŠน์ง• ๋“ฑ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ (Multithreading)
๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์Šค๋ ˆ๋“œ๋“ค์€ ๊ฐ™์€ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ๋ฐ ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

- ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ: ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋Š” ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๋™์ž‘ํ•˜๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ์™€ ์ž์›์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ๋น ๋ฅธ ํ†ต์‹ : ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ํ†ต์‹ ์ด ๋น ๋ฅด๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š”๋ฐ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค.
- ๊ฒฝ๋Ÿ‰: ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ์ „ํ™˜ ๋ฐ ์ƒ์„ฑ์ด ๋น„๊ต์  ๋น ๋ฅด๊ณ  ๊ฒฝ๋Ÿ‰์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ์–ด๋ ค์›€๊ณผ ์ฃผ์˜์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

- ๋™๊ธฐํ™”: ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ ๋™๊ธฐํ™” ๋ฌธ์ œ์™€ ๊ฒฝ์Ÿ ์ƒํƒœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- ๋””๋ฒ„๊น… ์–ด๋ ค์›€: ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ๊ณผ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค (Multiprocessing)
๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ„๋„ ํ”„๋กœ์„ธ์Šค๋“ค์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๋ฉฐ, ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ ์ด๋‚˜ ๋ฐ์ดํ„ฐ ๊ณต์œ ๋Š” ๋ณ„๋„์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

- ๋…๋ฆฝ์  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„: ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๋ฏ€๋กœ, ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ถฉ๋Œํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
- ์•ˆ์ •์„ฑ: ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์˜ ์˜ค๋ฅ˜๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์š” ์žฅ์ ์€ ๊ฐ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ๋…๋ฆฝ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์ด์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ ๊ณผ ๋ฐ์ดํ„ฐ ๊ณต์œ ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ ์€ IPC๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ IPC๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์–ด๋ ต์Šต๋‹ˆ๋‹ค. IPC๊ธฐ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„์— ๋”ฐ๋กœ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.


 

 

std::thread

C++์˜ `std::thread`๋Š” C++11๋ถ€ํ„ฐ ์ œ๊ณต๋˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค๋กœ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ๊ตฌํ˜„ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ ์‹คํ–‰์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์‚ฌ์šฉ๋ฒ•

std::thread๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹œ์ž‘ํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. #include <thread>๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ—ค๋” ํŒŒ์ผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
2. std::thread ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ํ•จ์ˆ˜ (๋˜๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด)์™€ ์ธ์ž๋“ค์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
3. ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ ๊ฐ์ฒด๋ฅผ .join() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
4. ์Šค๋ ˆ๋“œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด .join()์„ ํ˜ธ์ถœํ•˜์—ฌ ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰์ด ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์€ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค:

#include <iostream>
#include <thread>

void threadFunction(int num) {
    std::cout << "Thread started with argument: " << num << std::endl;
}

int main() {
    std::thread t(threadFunction, 42);  // ์Šค๋ ˆ๋“œ ์ƒ์„ฑ
    t.join();  // ์Šค๋ ˆ๋“œ ์‹คํ–‰ ์™„๋ฃŒ๊นŒ์ง€ ๋Œ€๊ธฐ

    std::cout << "Main thread continues..." << std::endl;
    return 0;
}

 

์•„๋ž˜๋Š” ๋žŒ๋‹คํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

#include <iostream>
#include <thread>

int main() {
    std::thread t([]() {
        for (int i = 0; i < 5; ++i) {
            std::cout << "Thread executing..." << std::endl;
        }
    });

    t.join();
    std::cout << "Main thread continues..." << std::endl;
    return 0;
}

 

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

#include <thread>
#include <iostream>
#include <vector>
using namespace std;

void doSomething(int id) {
    cout << id << "\n";
}

/**
 * Spawns n threads
 */
void spawnThreads(int n)
{
    std::vector<thread> threads(n);
    // spawn n threads:
    for (int i = 0; i < n; i++) {
        threads[i] = thread(doSomething, i + 1);
    }

    for (auto& th : threads) {
        th.join();
    }
}

int main()
{
    spawnThreads(10);
}

 

 

join & detach

std::thread์˜ join()๊ณผ detach()๋Š” ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰์„ ๊ด€๋ฆฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ์Šค๋ ˆ๋“œ์˜ ์ˆ˜๋ช…๊ณผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

1. join()
join() ๋ฉ”์„œ๋“œ๋Š” ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋กœํ‚นํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” join() ํ˜ธ์ถœ ์‹œ์ ์—์„œ ํ•ด๋‹น ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ดํ›„์—๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณ„์† ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

join()์„ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
- ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ.
- ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์Šค๋ ˆ๋“œ ์ž์›์„ ์ •๋ฆฌํ•˜๊ณ  ํ•ด์ œํ•จ.
- ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๋ธ”๋กœํ‚น ์ƒํƒœ๊ฐ€ ๋˜๋ฉฐ, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋‚˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•จ.


2. detach()
detach() ๋ฉ”์„œ๋“œ๋Š” ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹คํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„์— ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” detach() ํ˜ธ์ถœ ์ดํ›„์—๋„ ๋ฐ”๋กœ ์ง„ํ–‰๋˜๋ฉฐ, ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

detach()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
- ์Šค๋ ˆ๋“œ๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹คํ–‰.
- ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ ๋ฐ ํ•ด์ œ๋จ.
- ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ๋…๋ฆฝ์ ์ธ ์‹คํ–‰.

์˜ˆ์‹œ

#include <iostream>
#include <thread>

void threadFunction() {
    std::cout << "Thread started..." << std::endl;
    // ์Šค๋ ˆ๋“œ ์ž‘์—… ์ˆ˜ํ–‰
    std::cout << "Thread finished." << std::endl;
}

int main() {
    std::thread t(threadFunction);
    t.detach(); // ์Šค๋ ˆ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹คํ–‰

    // ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” t.detach() ์ดํ›„์—๋„ ์ง„ํ–‰๋จ

    std::cout << "Main thread continues..." << std::endl;
    return 0;
}



์—ฌ๊ธฐ์„œ ์ฃผ์˜์‚ฌํ•ญ์€, detach()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ๋ถ„๋ฆฌ๋œ ํ›„์—๋Š” ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜์ง€ ์•Š๋”๋ผ๋„ ํ•ด๋‹น ์Šค๋ ˆ๋“œ ๊ฐ์ฒด์˜ ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ž๋™์œผ๋กœ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด, join์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“  ์Šค๋ ˆ๋“œ์—์„œ ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ๋ฅผ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๊ณ , detach๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์Šค๋ ˆ๋“œ์˜ ์ž์›๋ฐ˜๋‚ฉ์„ OS์—๊ฒŒ ๋งก๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š”

  • ๊ณต์œ ์ž์›๊ณผ ๊ฒฝ์Ÿ ์ƒํƒœ(Shared resources, Race condition)
  • ๋ฐ๋“œ๋ฝ๊ณผ ๋ฎคํ…์Šค(Deadlock, mutex, lock)
  • atomic, condition_variable, wait/wait_for
  • std::async ์‚ฌ์šฉ๋ฒ•(์ž‘์—… ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ)

์— ๋Œ€ํ•ด์„œ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋Š” ์ด 3๊ฐœ์˜ ํŒŒํŠธ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ํฌ์ŠคํŒ…์ด ๊ทธ ์ฒซ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ : mutex, lock ์ฒ˜๋ฆฌ, ์ƒ์‚ฐ์ž-์†Œ๋น„์ž ํŒจํ„ด, async,
์„ธ ๋ฒˆ์งธ : ์Šค๋ ˆ๋“œํ’€ ๋งŒ๋“ค๊ธฐ, ์‹ค์ „ ์˜ˆ์ œ ์‚ดํŽด๋ณด๊ธฐ

 


 

 

์ดํ•ด๊ฐ€ ์•ˆ๋˜๊ฑฐ๋‚˜ ๋น ์ง„ ๋ถ€๋ถ„, ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š”~

๋Œ“๊ธ€