๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์šด์˜์ฒด์ œ

ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™” ๊ธฐ๋ฒ•

by ์„œ์•„๋ž‘๐Ÿ˜ 2023. 11. 6.

 

 

ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”

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

 

 

[C++] 21. ์Šค๋ ˆ๋“œ ๊ฒฝ์Ÿ ์ƒํƒœ(Race condition), ๋ฎคํ…์Šค(mutex), ๋ฐ๋“œ๋ฝ, std::conditional_variable, std::async

์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค, std::thread์— ๋Œ€ํ•ด ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค. [C++] 20. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Multi-Threads) ์˜ค๋Š˜์€ ์ด์–ด์„œ ์Šค๋ ˆ๋“œ๋ผ๋ฆฌ์˜ ์ถฉ๋Œ ๋ฌธ์ œ์™€ lock ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ณ , ์Šค

ground90.tistory.com

 

 

๋™๊ธฐํ™” ๊ธฐ๋ฒ•

ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”์˜ ๊ธฐ๋ฒ•์—๋Š” ๋ฎคํ…์Šค ๋ฝ, ์„ธ๋งˆํฌ์–ด, ๋ชจ๋‹ˆํ„ฐ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šด์˜์ฒด์ œ๋Š” ๋™๊ธฐํ™” ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์ž„๊ณ„ ์˜์—ญ์— ์˜ค์ง ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์ง„์ž…ํ•˜๋„๋ก ์ œ์–ดํ•˜๋ฉด์„œ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

 

๋ฎคํ…์Šค ๋ฝ

๋ฎคํ…์Šค๋Š” Mutual Exclusion์˜ ์•ฝ์–ด๋กœ, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์— ๋™์‹œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๋™๊ธฐํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ฎคํ…์Šค๋Š” ์ž„๊ณ„ ์˜์—ญ(Critical Section)์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ์ฝ”๋“œ ์˜์—ญ์— ๋ฝ(lock)์„ ๊ฑธ์–ด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด๋‹น ์˜์—ญ์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ฝ์€ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ํš๋“ํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฎคํ…์Šค๋Š” ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ๊ฒฝ์Ÿ ์ƒํƒœ(Race Condition)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

 

 

์ •๋ฆฌํ•˜๋ฉด ๋ฎคํ…์Šค ๋ฝ์€ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์œ„ํ•œ ๋™๊ธฐํ™” ๋„๊ตฌ๋กœ์จ ํƒˆ์˜์‹ค์— ์„ค์น˜๋œ ์ž๋ฌผ์‡ ๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํƒˆ์˜์‹ค์—๋Š” ์†๋‹˜ ํ•œ ๋ช…์”ฉ๋งŒ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์†๋‹˜์ด ํƒˆ์˜์‹ค์„ ์ด์šฉํ•˜๋ฉด ์ž๋ฌผ์‡ ๋ฅผ ์ž ๊ทธ๊ณ  ๋‹ค๋ฅธ ์†๋‹˜๋“ค์€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ํƒˆ์˜์‹ค ๋ฐ– ์†๋‹˜๋“ค(๋Œ€๊ธฐํ•˜๋Š” ํ”„๋กœ์„ธ์Šค)์€ ๊ฑธ๋ ค์žˆ๋Š” ์ž๋ฌผ์‡ (๋ฎคํ…์Šค ๋ฝ)๋ฅผ ๋ณด๊ณ  ํƒˆ์˜์‹ค(์ž„๊ณ„ ์˜์—ญ)์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์„ธ๋งˆํฌ์–ด

์„ธ๋งˆํฌ์–ด๋Š” ๋™์‹œ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ—ˆ์šฉ ๊ฐœ์ˆ˜๋ฅผ ์ œ์–ดํ•˜๋Š” ๋™๊ธฐํ™” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์„ธ๋งˆํฌ์–ด๋Š” ์นด์šดํ„ฐ ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ์ด ๊ฐ’์— ๋”ฐ๋ผ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์Šค๋ ˆ๋“œ๋‚˜ ํ”„๋กœ์„ธ์Šค์˜ ์ˆ˜๋ฅผ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค. ์„ธ๋งˆํฌ์–ด๋Š” ๋ฎคํ…์Šค์™€ ๋‹ฌ๋ฆฌ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ—ˆ์šฉ ๊ฐœ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ๋งˆํฌ์–ด๋Š” ์ฃผ๋กœ ์ œํ•œ๋œ ์ž์›์„ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

๋ฎคํ…์Šค ๋ฝ์€ ๊ณต์œ ์ž์›์ด ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๊ณ , ์„ธ๋งˆํฌ์–ด๋Š” ๊ณต์œ  ์ž์›์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์„ธ๋งˆํฌ์–ด๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์„ธ๋งˆํฌ์–ด์™€ ์นด์šดํŒ… ์„ธ๋งˆํฌ์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์„ธ๋งˆํฌ์–ด๋Š” ์นด์šดํŒ… ์„ธ๋งˆํฌ์–ด๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.

 

 

์„ธ๋งˆํฌ์–ด์˜ ์œ ๋ž˜๋Š” ์—ด์ฐจ ์‹ ํ˜ธ๊ธฐ์—์„œ ์™”์Šต๋‹ˆ๋‹ค. ์ž„๊ณ„ ์˜์—ญ ์•ž์—์„œ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹ ํ˜ธ๋ฅผ ๋ฐ›์œผ๋ฉด ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๊ณ , STOP์‹ ํ˜ธ์ด๋ฉด ์ง„์ž…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„ธ๋งˆํฌ์–ด๋Š” ์ž„๊ณ„ ๊ตฌ์—ญ์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ „์—ญ ๋ณ€์ˆ˜(S)์™€ ์ž„๊ณ„ ์˜์—ญ์— ๋“ค์–ด๊ฐ€๋„ ๋˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” waitํ•จ์ˆ˜, ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ์˜์—ญ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ์‹ ํ˜ธ๋ฅผ ์ฃผ๋Š” signal ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ชจ๋‹ˆํ„ฐ

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

 

์„ธ๋งˆํฌ์–ด๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๋ถˆํŽธํ•œ ๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๋ฒˆ ์ž„๊ณ„ ์˜์—ญ ์•ž๋’ค๋กœ ์ผ์ผ์ด wait๊ณผ signal ํ•จ์ˆ˜๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•˜๊ณ  ์ž˜๋ชป๋œ ์ฝ”๋“œ๋กœ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์„ธ๋งˆํฌ์–ด์˜ ์ž˜๋ชป๋œ ์‚ฌ์šฉ ์˜ˆ์‹œ

 

์ด์— ์ตœ๊ทผ ๋“ฑ์žฅํ•œ ๋ฐœ์ „๋œ ๋™๊ธฐํ™” ๋„๊ตฌ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ์ž…๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋™๊ธฐํ™” ๋„๊ตฌ์ด๋ฉฐ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์œ„ํ•œ ๋™๊ธฐํ™” ๋„๊ตฌ์™€ ์‹คํ–‰ ์ˆœ์„œ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๋™๊ธฐํ™” ๋„๊ตฌ๋ฅผ ๋ชจ๋‘ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์œ„ํ•œ ๋™๊ธฐํ™” ์ธก๋ฉด์—์„œ๋Š” ๊ณต์œ  ์ž์›๊ณผ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ ์ž์›์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ํ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ชจ๋‹ˆํ„ฐ ์•ˆ์— ํ•ญ์ƒ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ๋“ค์–ด์˜ค๋„๋ก ํ•˜์—ฌ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์œ„ํ•œ ๋™๊ธฐํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ ์ˆœ์„œ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๋™๊ธฐํ™”๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์กฐ๊ฑด์„ ๋ฐ”ํƒ•์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ผ์‹œ ์ค‘๋‹จํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋‹ˆํ„ฐ๋Š” ์กฐ๊ฑด ๋ณ€์ˆ˜(condition variable)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด ๋ณ€์ˆ˜๋Š” ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

 

 

์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์œ„ํ•œ ํ์™€ ์กฐ๊ฑด ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ์ž…๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ์—์„œ๋Š” ์กฐ๊ฑด ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด ๋ณ€์ˆ˜๋Š” wait๊ณผ signalํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ์ค€๋น„์ƒํƒœ์—์„œ ๋Œ€๊ธฐํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰์ƒํƒœ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

 

 


 

์ถœ์ฒ˜: ํ˜ผ์ž๊ณต๋ถ€ํ•˜๋Š” ์ปดํ“จํ„ฐ๊ตฌ์กฐ+์šด์˜์ฒด์ œ

 

๋Œ“๊ธ€