C#
C# -Thread 동기화 ! (lock 키워드/Monitor 클래스 사용)
이준호
2023. 6. 15. 15:41
반응형
동기화 란 ?
작업들 사이의 수행 시기를 맞추는 것
-> 다수의 스레드가 동시에 공유 자원을 사용할 때 순서를 정하는 것
복수의 스레드가 있을 때 문제가 된다.
지금 작업하고 있으니까 너는 대기해 이런식으로 순서를 정하는 것을 동기화라고 합니다.
동기화 키워드와 클래스
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 클래스 사용하기
반응형