๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Programming/C# & .NET

[C# ํ”„๋กœ๊ทธ๋ž˜๋ฐ] 2. ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”

๊ฐ•์˜ : [์ธํ”„๋Ÿฐ] C#.NET 0.5๋…„์ฐจ~3๋…„์ฐจ(ํŒŒํŠธ1)

 

์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”๋ž€

๋™๊ธฐํ™”๋Š” ๋‘˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ์ž‘์—…์„ ๋ฎ์ง€ ์•Š๊ณ  ๊ณต์œ  ๋ฆฌ์†Œ์Šค(์ž์›)์— ์•ˆ์ „ํ•˜๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

 

์ž„๊ณ„ ์˜์—ญ(critical section)์ด๋ž€?

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ๊ณต์œ  ์ž์›์ด ์„œ๋กœ ์ฐธ์กฐ๋  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์˜ ๋ฒ”์œ„ (์Šค๋ ˆ๋“œ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ)

 

 

โ–  ์˜ˆ์ œ 1

 

 

MessageBox์— 4๊ฐ€ ์•„๋‹Œ 3์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ

 

lock ํ‚ค์›Œ๋“œ

๋ณดํŽธ์ ์œผ๋กœ ๋™๊ธฐํ™”์— ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•œ๋‹ค.

object lockObj = new object()

lock(lockObj); โžœ ์ƒํ˜ธ ๋ฐฐ์ œ ์ž ๊ธˆ์„ ํš๋“

 

โ–  ์˜ˆ์ œ 2

 

์ž ๊ธˆ์— ์‚ฌ์šฉํ•  ๊ฐ์ฒด lockObj ์ถ”๊ฐ€

 

while(true) ์•ˆ์— lock(lockObj) ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ˜ธ ๋ฐฐ์ œ ์ž ๊ธˆ ํš๋“

 

 

MessageBox์— 4๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ ํ™•์ธ

 

 

lock ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

 

lock(obj)
{
	...
	lock(obj) 
    {
    	...
    }
}

 

์œ„์™€ ๊ฐ™์ด lock ์•ˆ์— ๋™์ผํ•œ ๊ฐ์ฒด์— ์ž ๊ธˆ์„ ์š”์ฒญ ์‹œ deadlock์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. try ~ catch๋กœ ์žกํžˆ๋Š” ์—๋Ÿฌ๋„ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ๋„ ์–ด๋ ต๋‹ค.

 

AutoResetEvent ํ‚ค์›Œ๋“œ

AutoResetEvent ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์Šค๋ ˆ๋“œ์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

ex) ์Šค๋ ˆ๋“œ1์ด ์„ ํ–‰๋œ ํ›„ ์Šค๋ ˆ๋“œ2 ์‹คํ–‰

 

 

โ–  ์˜ˆ์ œ 3

 

 

 

Work2()์˜ Thread.Sleep(5000) ๋ถ€๋ถ„์ด ์„ ํ–‰๋˜์–ด 5์ดˆ ํ›„์— a๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ

 

โ–  ์˜ˆ์ œ 4

 

 

 

โ–  ์˜ˆ์ œ 5

AutoResetEvent autoResetEvent = new AutoResetEvent(true);

๋งŒ์•ฝ ์—ฌ๊ธฐ์„œ AutoResetEvent์˜ ์ธ์ž๋ฅผ false๊ฐ€ ์•„๋‹Œ true๋กœ ์ฃผ๊ฒŒ ๋œ๋‹ค๋ฉด, ์ฒซ ๋ฒˆ์งธ ์‹ ํ˜ธ๋Š” ๋ฐ›์€ ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

 

 

 

โ–  ์˜ˆ์ œ 6

 

 

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ:

- https://codedragon.tistory.com/3529