ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•
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ํ•˜๊ฒŒ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์†์‹ค์‹œํ‚ค์ง€ ์•Š์œผ๋ฉฐ, ๋™๊ธฐํ™” ์—†์ด ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•

'๐Ÿ™‹โ€โ™‚๏ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด > 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
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€