ํฐ์คํ ๋ฆฌ ๋ทฐ
thread safe๋ ๋จ์ํ ์ฉ์ด๋ง ๋ณด๋๋ผ๋, thread ํ๊ฒฝ์์ ์ ๋์ํ๋ ๊ตฌ๋๋ผ๋ ๊ฒ์ ์ง๊ด์ ์ผ๋ก ์ ์ ์๋ค. ํ์ง๋ง reentrant๋ ๊ทธ๋ ์ง ์๋ค. ๊ณผ๊ฑฐ์๋ reentrant์ thread safe๋ฅผ ํผ์ฉํ์ฌ ์ฐ๋ ์ฑ ๋ค๋ ๋๋ฌ ์์๋ค. ์ด์, ์ด ๋์ ๋ช ํํ ๊ตฌ๋ถํ๊ณ ์ดํดํด๋ณด๊ณ ์ ํ๋ค.
thread safe
`thread safe`๋ ๋ง ๊ทธ๋๋ก, ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์๋ ์๋ ์๋ํ ๋๋ก ๋์ํ๋ ์ฝ๋๋ฅผ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค์ด `critical section`์ ์ ๊ทผํ๊ณ ์ ํ ๋, ์ค๋ ๋ ๋ณ๋ก ๋๊ธฐํ๋ฅผ ํ์ง ์๊ฒ ๋๋ฉด ์์น ์๋ ๊ฒฐ๊ณผ์ ์ง๋ฉดํ๊ฒ ๋๋ค.
char arr[10];
int idx = 0;
int func(char c)
{
int i = 0;
if (idx >= sizeof(arr))
return -1;
/* Lock the mutex here */
arr[idx] = c;
idx++;
/* Unlock the mutex here */
return idx;
}
์์ ํจ์๋ฅผ ์ฌ๋ฌ ์ค๋ ๋์์ ์ ๊ทผํ๊ณ ์ ํ๋ค๋ฉด, `global variable`์ธ `arr`, `idx`๋ฅผ ๋ค๋ฃจ๋ ๋ถ๋ถ์ด `critical section`์ด ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์, ์ด๋ฅผ ์ ์์ ์ผ๋ก ๋์ํ๊ธฐ ์ํด ๋๊ธฐํ๋ฅผ ํ์ฌ์ผ ํ๋ค.
reentrant
`reentrant`๋ ๋ฐ๋์ ํด๋น ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ด์ผ ๋๋ ๊ฒ์ ์๋์ง๋ง, ๋ค์ ์กฐ๊ฑด๋ค์ ์ถฉ์กฑํ์ฌ์ผ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
- global, static variable์ ์ฌ์ฉ, ๋ฐํํ๋ฉด ์ ๋๋ค.
- ์ฌ์ง์ ํ์์ ๋, ํด๋น ๊ฐ์ ์ฝ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ฉด ์์น ์๋ ๊ฐ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ํจ์ ํธ์ถ ์ ์ ๊ณตํ ๋งค๊ฐ ๋ณ์๋ง์ผ๋ก ๋์ํ์ฌ์ผ ํ๋ค.
- ํจ์ ๋ด์ non-reentrant๋ฅผ ํธ์ถํ๋ฉด ์ ๋๋ค.
int i;
// ์ ์ญ ๋ณ์๋ฅผ ๋ฐํํ๋ฏ๋ก, non-reentrant.
int test1()
{
return i * 5;
}
// non-reentrant์ธ test1()์ ํธ์ถํ๋ฏ๋ก, non-reentrant.
int test2()
{
return test1() * 5;
}
// test1()๊ณผ test2()๋ reentrant.
int test1(int i)
{
return i * 5;
}
int test2(int i)
{
return test1(i) * 5;
}
์์ ๊ฐ์ด ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ๋งค๊ฐ ๋ณ์๋ง์ ์ฌ์ฉํ๋ฉฐ reentrant ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
thread safe vs reentrant
์์ ๊ฐ๋ ์ ๋ช ํํ ์ดํดํ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๋ก ์ ๋๋ฌํ๊ฒ ๋๋ค. `thread safe`๋ผ๋ ๊ฒ์ global variable์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ์ ์์ค์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋๊ธฐํ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋๋ก ํจ์ ์๋ฏธํ๋ค. ํ์ง๋ง ์ด๋ฅผ ์์ธํ ๋ณธ๋ค๋ฉด, ๋๊ธฐํ๋ฅผ ์ํด์๋ ๋์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์ํ๋ ๊ฒ์ด ์๋ lock์ ํ๋ค ์ ์๋ ์ผ๋ถ ์ค๋ ๋๋ง ๋์ํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ค๋ ๋ ๋ณ๋ก ๋ณ๋๋ก ์ฒ๋ฆฌํ์ฌ์ผ ํ๋ ๊ฒฝ์ฐ reentrantํ๊ฒ ํจ์๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ๋ฐ์ดํฐ๋ฅผ ์์ค์ํค์ง ์์ผ๋ฉฐ, ๋๊ธฐํ ์์ด ๋ณ๋ ฌ์ ์ผ๋ก ๋์ํ ์ ์๊ฒ ๋๋ค.
'๐โโ๏ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C: ํ์ผ ๋ค๋ฃจ๊ธฐ (0) | 2021.06.12 |
---|---|
C: Signal (0) | 2021.06.11 |
C: Memory Layout of C Programs (0) | 2021.01.26 |
C: Storage class specifier (0) | 2020.11.27 |
C: fork() (0) | 2020.11.25 |