๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ๊ฐœ๋ฐœ์ž ์ด์•ผ๊ธฐ/โœ๏ธ ์ •๋ฆฌ๋…ธํŠธ

IOS์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ, ๊ฐœ๋…

by ์ •์„ ํ•œ 2023. 8. 17.
728x90
๋ฐ˜์‘ํ˜•

IOS์˜ GCD(Grand Central Dispatch)
 : ๋ฉ€ํ‹ฐ ์ฝ”์–ด ํ”„๋กœ์„ธ์„œ์— ์ฝ”๋“œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
GCD์˜ ์ž‘์—…๋‹จ์œ„ : Task
Task๋ฅผ Dispatch Queue์— ์ „๋‹ฌํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ํ•ด๋‹น ๋™์‹œ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•จ. Task์˜ ๋‹จ์œ„๋Š” {} ๋ธ”๋ก, DispatchWorkItem์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋œ๋‹ค.
Dispatch Queue๋Š” Main Thread, Background Thread์—์„œ Task๋“ค์„ Serially or Concurrently ํ•˜๋„๋ก ์‹คํ–‰์‹œํ‚ค๋Š” Dispatch Object์˜ ํด๋ž˜์Šค์ž„.

๋น„๋™๊ธฐ : DispatchQueue.main.async { code }
๋™๊ธฐ : DispatchQueue.main.sync { code }

Main Queue์— ์ „๋‹ฌ๋œ Task๋Š” ํ•ญ์ƒ Main Thread์— ์˜ํ•ด ์ˆ˜ํ–‰๋œ๋‹ค.
Global Queue์— ์ „๋‹ฌ๋œ Task๋˜ํ•œ Main Thread์—์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Œ > sync์˜ ๋ฉ”์„œ๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋กœ ์ธํ•ด ๋ฒŒ์–ด์ง€๋Š” ์ƒํ™ฉ์ด๋ฉฐ, ํ•ด๋‹น ํŒ๋‹จ์€ GCD์—์„œ ์‹คํ–‰ํ•จ.

Issue
Main Queue์— sync๋กœ Task๋ฅผ ์ „๋‹ฌํ•œ ๊ฒฝ์šฐ, Dedlock์„ ํ†ตํ•œ ์•ฑ ๊ฐ•์ œ์ข…๋ฃŒ ์ด์Šˆ ๋ฐœ์ƒ.
Conclusions
์•„์ง ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์€ Task๊ฐ€ ์กด์žฌํ•˜๋Š” SerialQueue์— ๋™๊ธฐ์ ์œผ๋กœ Task๋ฅผ ์ „๋‹ฌํ•จ. ๊ด€๋ จ ํ˜„์ƒ ๋ฐœ์ƒ ์‹œ, DeadLock์ด ๊ฑธ๋ฆฌ๋ฉด์„œ ์•ฑ์ด ์ข…๋ฃŒ๋˜๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒ.

Async๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ ์œผ๋กœ Task๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ, Task๋ฅผ ํƒ€๊ฒŸ Queue์— ์ถ”๊ฐ€๋งŒ ํ•˜๊ณ  ํ•ด๋‹น ์ฝ”๋“œ ๋ธ”๋ก์€ Return๋œ๋‹ค. ์ดํ›„ ์ถ”๊ฐ€๋œ Task๋Š” GCD์˜ ํŒ๋‹จ์— ๋”ฐ๋ผ ํ•ด๋‹น ์‹œ์ ์— ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋Š” ์ •ํ™•ํ•œ ์‹คํ–‰ ์‹œ์ ์„ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค.
Sync๋ฅผ ํ†ตํ•ด ๋™๊ธฐ์ ์œผ๋กœ Task๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น Queue์— ์ถ”๊ฐ€๋œ ์ฆ‰์‹œ GCD๋Š” Task๋ฅผ Thread์— ๋ฐฐ์ •ํ•˜๊ณ  ํ•ด๋‹น Task๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์ „๊นŒ์ง€ Queue์— ๋‚จ์€ Task์— Lock์„ ๊ฑธ๊ณ  ํ•ด๋‹น ์ฝ”๋“œ ๋ธ”๋ก์œผ๋กœ Return ํ•˜์ง€ ์•Š๋Š”๋‹ค.
Lock์ด ๊ฑธ๋ฆฌ๋ฉด Queue์— ๋‚จ์•„์žˆ๋Š” ๋‹ค๋ฅธ Task๋“ค์€ Thread๋ฅผ ๋ฐฐ์ • ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.

See Also

 

728x90
๋ฐ˜์‘ํ˜•