์๋ ํ์ธ์. ์ด๋ฒ์๋ Objective-C์์ ๋ฉํฐ์ค๋ ๋ฉ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ ์ค๋ ๋ ๊ฐ ๋๊ธฐํ๋ฅผ ์ํ @synchronized ์ง์์ด์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
๐ ์ค๋ ๋ฉ ์ง์ ๊ฐ์
Objective-C๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฉํฐ์ค๋ ๋ฉ์ ์ง์ํฉ๋๋ค. ์ด๋ ๋ ๊ฐ์ ์ค๋ ๋๊ฐ ๋์์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ค๊ณ ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ด๋ฌํ ์ํฉ์ ํ๋ก๊ทธ๋จ์์ ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
๋ฉํฐ์ค๋ ๋ฉ(Multithreading): ์ฌ๋ฌ ์คํ ํ๋ฆ(์ค๋ ๋)์ด ๋์์ ์คํ๋๋ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Objective-C๋ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์ฝ๋ ์น์ ์ ์คํํ ์ ์๋๋ก ๋ณดํธํ๋ @synchronized() ์ง์์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฐธ๊ณ ๋ก ์ค๋ ๋ ๋๊ธฐํ์ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ GNU Compiler Collection(GCC) ๋ฒ์ 3.3 ์ด์์์ -fobjc-exceptions ์ค์์น๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ OS X v10.3 ์ด์์์๋ง ์คํ๋ ์ ์์ต๋๋ค.
๐ @synchronized ์ง์์ด ์ดํดํ๊ธฐ
@synchronized() ์ง์์ด๋ ์ฝ๋ ์น์ ์ ์ ๊ฐ์ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. ๋ณดํธ๋ ์ฝ๋๋ฅผ ์คํ ์ค์ธ ์ค๋ ๋๊ฐ ํด๋น ์ฝ๋๋ฅผ ๋น ์ ธ๋๊ฐ ๋๊น์ง ๋ค๋ฅธ ์ค๋ ๋๋ ์ฐจ๋จ๋ฉ๋๋ค.
@synchronized(object) {
// ๋ณดํธ๋ ์ฝ๋ ์น์
// ์ด ์ฝ๋๋ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์คํํ ์ ์์ต๋๋ค
}
๋๊ธฐํ(Synchronization): ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ์ ๊ทผํ ๋ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํ ์กฐ์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
@synchronized() ์ง์์ด๋ ์ ์ผํ ์ธ์๋ก self๋ฅผ ํฌํจํ ๋ชจ๋ Objective-C ๊ฐ์ฒด๋ฅผ ๋ฐ์ต๋๋ค. ์ด ๊ฐ์ฒด๋ ์ํธ ๋ฐฐ์ ์ธ๋งํฌ์ด(mutex)๋ผ๊ณ ์๋ ค์ ธ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ค๋ ๋๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ์ฝ๋ ์น์ ์ ์ ๊ธ ์ ์์ต๋๋ค.
๋ฎคํ ์ค(Mutex): Mutual Exclusion์ ์ค์๋ง๋ก, ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ๋์์ ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ์ค์ ์น์ ๋ค์ ๋ณดํธํ๊ธฐ ์ํด ๋ณ๋์ ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ฒฝ์ ์กฐ๊ฑด(race condition)์ ํผํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉํฐ์ค๋ ๋๊ฐ ๋๊ธฐ ์ ์ ๋ชจ๋ ์ํธ ๋ฐฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ฐ์ฅ ์์ ํฉ๋๋ค.
๊ฒฝ์ ์กฐ๊ฑด(Race Condition): ๋ ๊ฐ ์ด์์ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ๋์์ ์ ๊ทผํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ก, ์คํ ์์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
๐ synchronized ์ฌ์ฉ ์์
์ธ์คํด์ค ๋ฉ์๋ ์ ๊ทธ๊ธฐ (self ์ฌ์ฉ)
๋ค์ ์์ ๋ ํ์ฌ ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ฉ์๋์ ๋ํ ์ ๊ทผ์ ๋๊ธฐํํ๊ธฐ ์ํด self๋ฅผ ๋ฎคํ ์ค๋ก ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ณด์ฌ์ค๋๋ค:
- (void)criticalMethod
{
@synchronized(self) {
// ์ค์ํ ์ฝ๋
// ์ด ์ฝ๋๋ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์คํํ ์ ์์ต๋๋ค
}
}
์ด์ ์ ์ฌํ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ จ ํด๋์ค์ ํด๋์ค ๋ฉ์๋์ ๋ํ ์ ๊ทผ์ ๋๊ธฐํํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ๋ชจ๋ ํธ์ถ์๊ฐ ๊ณต์ ํ๋ ํ๋์ ํด๋์ค ๊ฐ์ฒด๋ง ์๊ธฐ ๋๋ฌธ์ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ํด๋์ค ๋ฉ์๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ ์ธ๋งํฌ์ด ์ฌ์ฉ
๋ค์์ ๋ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ์ค์ํ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ธฐ ์ ์, ์ฝ๋๋ Account ํด๋์ค์์ ์ธ๋งํฌ์ด๋ฅผ ๊ฐ์ ธ์ ์ค์ํ ์น์ ์ ์ ๊ทธ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค:
Account *account = [Account accountFromString:[accountField stringValue]];
// ์ธ๋งํฌ์ด ๊ฐ์ ธ์ค๊ธฐ
id accountSemaphore = [Account semaphore];
@synchronized(accountSemaphore) {
// ์ค์ํ ์ฝ๋
// ์ด ์ฝ๋๋ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์คํํ ์ ์์ต๋๋ค
}
Account ํด๋์ค๋ initialize ๋ฉ์๋์์ ์ธ๋งํฌ์ด๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ฒด ์ธ์คํด์ค์ ๋ํ ์ ๊ทผ์ ๋จ์ผ ์ธ๋งํฌ์ด๋ก ์ ์ดํ ์ ์์ต๋๋ค.
๐ ์ฌ๊ท์ ์ฝ๋ ๋ฐ ์์ธ ์ฒ๋ฆฌ
Objective-C ๋๊ธฐํ ๊ธฐ๋ฅ์ ์ฌ๊ท์ ์ด๊ณ ์ฌ์ง์ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์ง์ํฉ๋๋ค. ์ค๋ ๋๋ ํ๋์ ์ธ๋งํฌ์ด๋ฅผ ์ฌ๊ท์ ์ธ ๋ฐฉ์์ผ๋ก ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ค๋ ๋๋ ํด๋น ์ค๋ ๋๊ฐ ํ๋ํ ๋ชจ๋ ์ ๊ธ์ ํด์ ํ ๋๊น์ง ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ์ง ๋ชปํฉ๋๋ค.
์ฌ๊ท์ ์ฝ๋(Recursive Code): ํจ์๋ ๋ฉ์๋๊ฐ ์๊ธฐ ์์ ์ ํธ์ถํ๋ ์ฝ๋์ ๋๋ค. ์ฌ์ง์ ๊ฐ๋ฅํ ์ฝ๋(Reentrant Code): ๋์์ ์ฌ๋ฌ ์ค๋ ๋์์ ์์ ํ๊ฒ ํธ์ถ๋ ์ ์๋ ์ฝ๋์ ๋๋ค.
@synchronized() ๋ธ๋ก ๋ด์ ์ฝ๋๊ฐ ์์ธ๋ฅผ ๋ฐ์์ํค๋ฉด, Objective-C ๋ฐํ์์ ์์ธ๋ฅผ ์บ์นํ๊ณ , ์ธ๋งํฌ์ด๋ฅผ ํด์ ํ ๋ค์(๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ณดํธ๋ ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ก), ์์ธ๋ฅผ ๋ค์ ์์ธ ํธ๋ค๋ฌ์ ๋ค์ ๋์ง๋๋ค.
@synchronized(self) {
// ์ด ์ฝ๋์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด
// ๋ฐํ์์ด ์๋์ผ๋ก ์ ๊ธ์ ํด์ ํฉ๋๋ค
[self methodThatMightThrowException];
}
์ด ๊ธฐ๋ฅ์ ์์ธ ๋ฐ์ ์์๋ ๋ฐ๋๋ฝ(deadlock)์ ๋ฐฉ์งํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์ฌ์ค๋๋ค.
๋ฐ๋๋ฝ(Deadlock): ๋ ๊ฐ ์ด์์ ์ค๋ ๋๊ฐ ์๋ก์ ์์ ์ด ๋๋๊ธฐ๋ฅผ ๋ฌดํ์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ์ ๋๋ค.
๐ ๋๊ธฐํ ๋ชจ๋ฒ ์ฌ๋ก
1. ์ ์ ํ ์ธ๋งํฌ์ด ์ ํํ๊ธฐ
๋๊ธฐํ์ ์ฌ์ฉํ ๊ฐ์ฒด(์ธ๋งํฌ์ด)๋ฅผ ์ ํํ ๋๋ ๋ค์ ์ฌํญ์ ๊ณ ๋ คํ์ธ์:
- ๋ณดํธํ๋ ค๋ ๋ฆฌ์์ค์ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์๋ก ๋ค๋ฅธ ์ค์ ์น์ ์๋ ๋ณ๋์ ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๊ฐ๋ฅํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉํฐ์ค๋ ๋๊ฐ ๋๊ธฐ ์ ์ ์ธ๋งํฌ์ด๋ฅผ ์์ฑํฉ๋๋ค.
2. ๋๊ธฐํ ๋ธ๋ก ์ต์ํํ๊ธฐ
์ฑ๋ฅ์ ์ํด @synchronized ๋ธ๋ก์ ๊ฐ๋ฅํ ํ ์๊ฒ ์ ์งํ์ธ์:
// ์ข์ง ์์ ๋ฐฉ๋ฒ
@synchronized(self) {
// ๋๊ธฐํ๊ฐ ํ์ํ์ง ์์ ๊ธด ๊ณ์ฐ
expensiveCalculation();
// ์ค์ ๋ก ๋๊ธฐํ๊ฐ ํ์ํ ๋ถ๋ถ
[self updateSharedResource];
}
// ๋ ์ข์ ๋ฐฉ๋ฒ
// ๋๊ธฐํ๊ฐ ํ์ํ์ง ์์ ์์
์ํ
expensiveCalculation();
// ํ์ํ ๋ถ๋ถ๋ง ๋๊ธฐํ
@synchronized(self) {
[self updateSharedResource];
}
3. ์ค์ฒฉ๋ ์ ๊ธ ์ฃผ์ํ๊ธฐ
์ค์ฒฉ๋ @synchronized ๋ธ๋ก์ ๋ฐ๋๋ฝ ์ํ์ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ๋ฉด ํผํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ํญ์ ๋์ผํ ์์๋ก ์ ๊ธ์ ํ๋ํ์ธ์:
// ์ํํ ์ ์์: ํญ์ ๊ฐ์ ์์๋ก ์ ๊ธ์ ํ๋ํด์ผ ํจ
@synchronized(objectA) {
@synchronized(objectB) {
// ์ฝ๋
}
}
๋ง๋ฌด๋ฆฌ
Objective-C์ @synchronized ์ง์์ด๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๊ณต์ ์์์ ๋ํ ์ ๊ทผ์ ๋๊ธฐํํ๋ ๊ฐ๋จํ๊ณ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ์์์ ๋ฐฉ์งํ๊ณ ์ค๋ ๋ ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
'๐ฅ Bread Basics > Obj-c' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์์ธ ์ฒ๋ฆฌ (1) | 2025.04.14 |
---|---|
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ๋ ํฐ(Selector) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ์ ๋์ ์ดํดํ๊ธฐ (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๋น ๋ฅธ ์ด๊ฑฐ(Fast Enumeration) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ฐ๊ด ์ฐธ์กฐ(Associative References) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - Categories์ Extensions (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ์ธ๋ ํ๋กํผํฐ(Declared Properties) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํ๋กํ ์ฝ (0) | 2025.04.14 |