본문 바로가기

C#

C# -Thread 동기화 ! (lock 키워드/Monitor 클래스 사용)

반응형

 

동기화 란 ? 
작업들 사이의 수행 시기를 맞추는 것
 -> 다수의 스레드가 동시에 공유 자원을 사용할 때 순서를 정하는 것 
복수의 스레드가 있을 때 문제가 된다. 
지금 작업하고 있으니까 너는 대기해 이런식으로 순서를 정하는 것을 동기화라고 합니다. 

동기화 키워드와 클래스 
lock : 동기화 키워드  
Monitor 
Mutex
Interlocked
AutoResetEvent
ManualResetEvent

동기화 대상
* 공유 자원에 대한 접근이 예상되는 스레드
* 한 객체를 다수의 스레드가 사용되는 때 

lock 형식 
private object obj = new object();

lock( obj )
{
임계(경계) 영역 (critical section)
}

 

lock 주의할 점 
*lock(this)
*lock(typeof(클래스명))
->위와 같이 사용하는 것은 자제 할 것!

lock 사용 예 
* 공유 자원(변수)을 스레드가 사용하는 예 
*
*lock과 private object 형을 사용한 동기화 
*

이렇게 lock 키워드를 사용 하면 ! 

 

 

 

 

Thread id 3 번이 1에서 10번까지 충분히 스레드를 사용 하고 나서 

Thread id 4 번이 다시 해당 스레드에 접근하여 작업을 한다 ! 

해당 스레드 사용중에 다른 곳에서 접근하여 스레드를 뺏어쓰는 경우가 없어진다. 

 

* 스레드 함수가 객체를 통해 값을 증가하는 예 

 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;


namespace ConsoleApp15
{
    class ThisLock
    {
        public void IncreadCount(ref int count)
        {
            count++;
        }
    }
    class Test
    {
        static int count; // 공유 자원
        static object obj = new object();

        ThisLock lockObject = new ThisLock();


        public void Proc()
        {
            lock (lockObject) // 다른 스레드가 해당 메서드를 사용할려고 때 기다려! 잡아주는 역할 
            {
                for (int i = 0; i < 10; i++)
                {
                    lockObject.IncreadCount(ref count);
                    count++;
                    Console.WriteLine($"Thread id : {Thread.CurrentThread.GetHashCode()}, result : {count}");
                }
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();
            //하나의 객체를 두개의 스레드에서 사용 
            Thread[] threads = new Thread[3];

            for (int i = 0; i < 3; i++)
            {
                threads[i] = new Thread(new ThreadStart(test.Proc));
            }
            for (int i = 0; i < 3; i++)
            {
                threads[i].Start();
            }
        }
    }
}

Monitor 클래스 사용하기 

반응형