๋ณธ ๊ฒ์๋ฌผ์ ์จ๋ฐ์ ์ธํ๋ฐ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์์ฑํ ๊ธ ์ ๋๋ค.
์์ ์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ 2๊ฐ์ ์ค๋ ๋๊ฐ ๋์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ์ ์๋ค. ์ด๋ฌํ ์ํฉ์์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋๋ฐ..
์ด๋ฐ ๋ฌธ์ ๋ Thread-Safety๋ฅผ ํตํด ํด๊ฒฐํ ์ ์๋ค. ๋จ์ด์ ๋ป ๊ทธ๋๋ก ์ค๋ ๋๋ฅผ ์์ ํ๊ฒ ์ฌ์ฉํ๋ค. ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๋์์ ์ฌ์ฉํ๋ค๊ณ ํด๋ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์๊ณ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. ํ๋ฒ์ ํ๊ฐ์ ์ค๋ ๋๋ง ์์์ ์ ๊ทผํ ์ ์๊ฒ ํ์ฌ ๊ฒฝ์์ํฉ์ ๋ฐ์์ํค์ง ์๊ณ ์์ ํ๊ฒ ์ฌ์ฉํ๋ค. ์ด๋ ๊ฒ ์ฌ์ฉํจ์ Thread-Safetyํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ค๊ณ ํ๋ค.
1. ๊ฒฝ์์ํฉ (Race Condition)
var a = 1
DispatchQueue.global().async {
sleep(1)
a += 1
}
DispatchQueue.global().async {
sleep(1)
a += 1
}
print(a)
์์ ๊ฐ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋์คํจ์นํ์ ์์ ์ ๋ณด๋ด๋ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
ํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ง ์๊ณ ๋ฐ๋ก ๋ฐํ๋์ด ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ค.
์ฒซ๋ฒ์งธ ์์ ์์ a๋ 1์ด๊ณ , ์ด 1์ด๋ผ๋ ๊ฐ์ ๋ํด 1์ ๋ํ๋ค.
๋๋ฒ์งธ ์์ ์์ ๋ด๊ฐ ์ํ๋ ๊ณผ์ ์ ์์์ ๊ณ์ฐํ ๊ฒฐ๊ณผ์ธ 2์ 1์ ๋ํด 3์ ์ถ๋ ฅํ๋๊ฒ ๋ชฉํ์ง๋ง, ๋๋ฒ์งธ ์์ ์ a๊ฐ 1์ธ ์ํ์์ ๊ฐ์ ๋ถ๋ฌ์ ๋ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ์ ์ผ๋ก 2๋ผ๋ ๊ฐ์ด ์ถ๋ ฅ๋์ด ์์๊ณผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ค.
๋ ์์ ์ด ๊ฐ๊ฐ ๋ค๋ฅธ ์ค๋ ๋์ ๋ฐฐ์น๋์ด ํ๋์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ์ฌ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ด ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒ์ด๋ค.
2. ๊ต์ฐฉ์ํ (Deadlock)
2๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅธ ์ค๋ ๋์ ๋ฐฐ์นํ์ฌ ์์ ์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์..
ํ๋์ ์์์ 2๊ฐ ์ด์์ ์ค๋ ๋๊ฐ ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ค๋ ๋์ ์์ ์ด ๋ฐฐ์น๋๋ฉด ๋ค๋ฅธ ์ค๋ ๋์ ์ ๊ทผ์ ๋ง๋๋ค.
์ด๋ฐ ๊ณผ์ ์์ ์์ ์ด ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ค๋ฉด ๊ด์ฐฎ์ง๋ง ์ด ์์ ์ด ์๋ก์๊ฒ ์ํฅ์ ์ค๋ค๋ฉด, ์๋ก์ ์ ๊ทผ์ ๋ง์ ์ํฉ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๊ต์ฐฉ์ํ๊ฐ ๋ฐ์ํ๋ค. ์์ ์ด ์ด๋ฌ์ง๋ ์ ๋ฌ์ง๋ ๋ชปํ๊ณ ์งํ์ด ๋์ง ์๋ ์ํ๋ฅผ ์๋ฏธํ๋ค.
์ด๋ฐ ๊ต์ฐฉ์ํ๋ 1) ๋๊ธฐ ์์ ์ด ํ์ฌ ์ค๋ ๋๊ฐ ํ์ํ ๊ฒฝ์ฐ, 2) ์์ ์์ ์ด ํ์ฌ์ ์ค๋ ๋๊ฐ ํ์ํ ๊ฒฝ์ฐ, 3) ์ฌ๋ฌ๊ฐ์ ์ธ๋งํฌ์ด๊ฐ ์กด์ฌํ ๋(์๋ชป๋ ์์ ์ค๊ณ)์ ๊ฐ์ ์ํฉ์ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
์ด ๋ฌธ์ ๋ ์ด๋ป๊ฒ ํด๊ฒฐํ ๊น? ์๋ฆฌ์ผ ํ๋ก ํด๊ฒฐํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ธ๋งํฌ์ด๋ ์ ํ๋ ๋ฆฌ์์ค ์์ ๊ฐ์๊ฒ์ ์กฐ์ฌํ ์ฌ์ฉํด์ผํ๊ณ , ๊ฐ์ฒด๋ฑ์ ์ค๊ณํ ๋ ์ฃผ์ํด์ผ ํ๋ค.
3. ์ฐ์ ์์์ ๋ค๋ฐ๋ (Prioirty Inversion)
๋ฉ๋ชจ๋ฆฌa๋ผ๋ ์์์ ํ๊ฐ์ ์ค๋ ๋์์ ์ ๊ทผ์ค์ด๋ฉด ๋ค๋ฅธ ์ค๋ ๋์์ ์ ๊ทผํ ์ ์๋ค.
๋ฐ๋ผ์ Thread4์ ๋ฐฐ์น๋๋ฉด ๋ฉ๋ชจ๋ฆฌa์ ๋ค๋ฅธ ์ค๋ ๋๋ ์ ๊ทผํ ์ ์๊ณ , task1์ ์ฐ์ ์์๊ฐ ๋ ๋์ task2๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ์ ๋ฉ์ถ๋ค.
task2๋ ์ฒ๋ฆฌ ์ค task3์ด ๋ ์ฐ์ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฉ์ถ๊ฒ ๋๊ณ , task3์ ์ฒ๋ฆฌํ๋ค.
๊ทธ๋ฌ๋ ๋ฉ๋ชจ๋ฆฌa๋ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ task3์ด ๋ฉ์ถ๊ฒ ๋๊ณ , task2๊ฐ ์๋๋ผ๋ฉด ์ฒ๋ฆฌ๋์ด์ผ ํ์ง๋ง GCD๊ฐ ์ด๋ฅผ ์์์ ์ฐ์ ์์๋ฅผ ์กฐ์ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋๋ task3์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฐฉํด(?)๊ฐ ๋๋ task1์ ๋จผ์ ์ฒ๋ฆฌํ๊ณ task3์ ์ฒ๋ฆฌํ๊ณ task2๋ฅผ ์ฒ๋ฆฌํ๋ค. (task1 -> task3 -> task2)
์ฐ์ ์์๊ฐ ๋์ task3์ด ๊ฐ์ฅ ๋จผ์ ์ฒ๋ฆฌ๋์ด์ผํ์ง๋ง task1์ด ๊ฐ์ฅ ๋จผ์ ์ฒ๋ฆฌ๋์๋ค. ์ด๋ฐ ์ฐ์ ์์์ ๋ค๋ฐ๋์ด ์๊ธธ ์ ์๋ค.
์ด๋ฐ ์ฐ์ ์์๋ 1) ์๋ฆฌ์ผํ์์ ๋์ ์ฐ์ ์์ ์์ ์ด ๋ฎ์ ์ฐ์ ์์ ๋ค์ ๋ณด๋ด์ง๋ ๊ฒฝ์ฐ, 2) ๋ฎ์ ์ฐ์ ์์์ ์์ ์ด ๋์ ์ฐ์ ์์๊ฐ ํ์ํ ์์์ ์ ๊ทธ๊ณ ์๋ ๊ฒฝ์ฐ(lock, ์ธ๋งํฌ์ด), 3) ๋์ ์ฐ์ ์์ ์์ ์ด ๋ฎ์ ์์ ์ ์์ ํ๋ ๊ฒฝ์ฐ(Operation)์ ๋ฐ์ํ๋ค.
์ด๋ฐ ๋ฌธ์ ๋ 1์ฐจ์ ์ผ๋ก๋ GCD๊ฐ ์ฐ์ ์์๋ฅผ ์กฐ์ ํด์ ์์์ ํด๊ฒฐํ๋ค! (์์ ๊ฐ์ด..)
๊ทธ๋ฆฌ๊ณ ์ ๊ทธ๋ฆผ์์ Qos๊ฐ ๊ฐ๊ฐ ๋ฌ๋์ง๋ง ๋์ผํ Qos๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค.