<aside> ๐Ÿ“— ๋ชฉ์ฐจ


</aside>

๊ณต์œ  ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ์‹œ ๋ฌธ์ œ์ 

<aside> ๐Ÿ’ก ๋””์Šค์–ด์…ˆ๋ธ”๋ง - ์ฆ๊ฐ ์—ฐ์‚ฐ์ž ++ ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ฏธ๋ฆฌ ์ˆ™์ง€ํ•˜์‹œ๊ณ ..

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ด…์‹œ๋‹ค


int32 sum =	0; // ์ „์—ญ๋ณ€์ˆ˜์ž„

void Add() 
{
	for (int32 i = 0; i < 1'000'000; i++)
	{
		sum ++;
	}
}

void Sub()
{
	for (int32 i = 0; i < 1'000'000; i++)
	{
		sum--;
	}
}

</aside>

โ†’ ์‹คํ—˜1 : 100๋งŒ๋ฒˆ ์ˆ˜ ๋นผ๊ณ  ๋”ํ•˜๊ธฐ (๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œX)

<aside> ๐Ÿ’ก ๊ฒฐ๊ณผ๋Š” ๋‹น์—ฐํžˆ 0์ด๋‹ค


int main()
{
	Add();
	Sub();
	cout << sum << endl;
}

</aside>

โ†’ ์‹คํ—˜2 : 100๋งŒ๋ฒˆ ์ˆ˜ ๋นผ๊ณ  ๋”ํ•˜๊ธฐ (๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œO)

<aside> ๐Ÿ’ก ๊ฒฐ๊ณผ๋Š” ์‹คํ–‰๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค

int main()
{
	thread t1(Add);
	thread t2(Sub);

	if(t1.joinable()) t1.join();
	if(t2.joinable()) t2.join();

	cout << sum << endl;
}

์™œ ๋‚ด๊ฐ€ ์•Œ๋˜ ๋”ํ•˜๊ธฐ ๋นผ๊ธฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ๊ฐ€?

</aside>

โ†’ ๋‘ ์ฝ”๋“œ์˜ ์ฐจ์ด์ ์€ Race Condition ๋–„๋ฌธ์ž„

<aside> ๐Ÿ’ก ์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” race condition์ž…๋‹ˆ๋‹ค.


sequenceDiagram
    participant ๋ฉ”๋ชจ๋ฆฌ
    participant ์Šค๋ ˆ๋“œ1
    participant ์Šค๋ ˆ๋“œ2

    ๋ฉ”๋ชจ๋ฆฌ->>๋ฉ”๋ชจ๋ฆฌ: sum = 0
    ์Šค๋ ˆ๋“œ1->>๋ฉ”๋ชจ๋ฆฌ: sum ์ฝ๊ธฐ (0)
    ์Šค๋ ˆ๋“œ2->>๋ฉ”๋ชจ๋ฆฌ: sum ์ฝ๊ธฐ (0)
    ์Šค๋ ˆ๋“œ1->>์Šค๋ ˆ๋“œ1: ์ฆ๊ฐ€ (1)
    ์Šค๋ ˆ๋“œ2->>์Šค๋ ˆ๋“œ2: ๊ฐ์†Œ (-1)
    ์Šค๋ ˆ๋“œ1->>๋ฉ”๋ชจ๋ฆฌ: sum ์“ฐ๊ธฐ (1)
    ์Šค๋ ˆ๋“œ2->>๋ฉ”๋ชจ๋ฆฌ: sum ์“ฐ๊ธฐ (-1)
    ๋ฉ”๋ชจ๋ฆฌ->>๋ฉ”๋ชจ๋ฆฌ: ์ตœ์ข… sum = -1 ๋˜๋Š” 1
    Note over ๋ฉ”๋ชจ๋ฆฌ,์Šค๋ ˆ๋“œ2: ์˜ˆ์ƒ ๊ฒฐ๊ณผ 0์ด ์•„๋‹˜

์ด ๋‹ค์ด์–ด๊ทธ๋žจ์€ race condition์ด ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

  1. ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ(sum)์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ํ˜„์žฌ ๊ฐ’์„ ์ฝ๊ณ , ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์”๋‹ˆ๋‹ค.
  3. ํ•˜์ง€๋งŒ ์ด ๊ณผ์ •์ด ์›์ž์ (atomic)์ด์ง€ ์•Š์•„ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ ์ด์œ :

  1. ๋™์‹œ ์ ‘๊ทผ: ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— sum ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
  2. ๋น„์›์ž์  ์—ฐ์‚ฐ: sum++์™€ sum-- ์—ฐ์‚ฐ์ด ํ•œ ๋ฒˆ์— ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ฝ๊ธฐ, ์ˆ˜์ •, ์“ฐ๊ธฐ์˜ ์„ธ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ)
  3. ์ค‘๊ฐ„ ์ƒํƒœ ๋ฎ์–ด์“ฐ๊ธฐ: ํ•œ ์Šค๋ ˆ๋“œ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ๋ฎ์–ด์“ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. </aside>

<aside> ๐Ÿ’ก ๊ฒฐ๊ตญ, [์ฆ๊ฐ ์—ฐ์‚ฐ์ž (์ „์œ„,ํ›„์œ„ ์—ฐ์‚ฐ)](https://cybecho.notion.site/5e2280c484414c779a6ffd1c2b2e4e02) ๋Š” ์›๋ณธ๊ฐ’์„ ์–ด๋”˜๊ฐ€์— ๊ฐ€์ ธ๊ฐ”๋‹ค๊ฐ€, ๊ฐ’์„ ์ฆ๊ฐ์‹œํ‚ค๊ณ  ๋‹ค์‹œ ์›๋ž˜์ž๋ฆฌ๋กœ ๋Œ๋ ค๋‘์ž–์•„?

๊ทผ๋ฐ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์›๋ž˜ ์ž๋ฆฌ๋กœ ๋Œ๋ ค๋‘๋Š” ๊ณผ์ •์—์„œ, ๋‘˜ ๋‹ค ๋™์ผํ•œ ์žฅ์†Œ์— ๊ฐ€์ ธ๋‹ค๋‘๋‹ค๋ณด๋‹ˆ, ์„œ๋กœ๊ฐ€ ๋ณต์‚ฌํ•ด๊ฐ”๋˜ ์‹œ์ ํ•˜๊ณ  ๋ถ™์—ฌ๋„ฃ๋Š” ์‹œ์ ์ด ์„œ๋กœ๋‹ค๋ฅด๊ธฐ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค!

์ด๊ฒƒ์€ ๋งˆ์น˜ git commit์ด ๊ผฌ์ธ๊ฒƒ๊ณผ ๊ฐ™์€์ƒํ™ฉโ€ฆ

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์˜์—ญ์„ ๊ณต์œ ํ•œ๋‹ค๋ฉด, ์ž„๊ณ„์˜์—ญ์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผํ•œ๋‹ค

</aside>