Programming/C#

[C#] Thread(3) 스레드 동기화

devfactory 2024. 9. 28. 23:38

멀티 스레드의 문제

스레드의 수가 많아질수록 관리가 어렵고 더 많은 문제가 발생하게 된다.

여러 개의 스레드가 하나의 자원을 공유하기 때문이다.

 

스레드가 자신의 내부에서만 자원을 사용한다면 문제가 되지 않는다. 하지만 여러 개의 스레드가 동시에 하나의 자원을 사용하려 한다면 병목현상이 나타난다. 또한 하나의 스레드가 자원을 독점하고 있다면 나머지 스레드는 무한히 대기해야 하는 데드락 현상이 발생할 수 있다.

 

동기화

동기화란 여러 곳에서 자원을 요청했을 때 순차적으로 사용한다는 개념이다.

1개의 데이터를 여러 스레드가 공유할 때 특정스레드가 어떤 자원을 사용하게 되면 나머지 스레드가 접근할 수 없도록 lock을 걸고 사용이 끝나면 lock을 해제하여 다른 스레드가 접근할 수 있도록 한다. 동기화를 하는 대표적인 방법으로 lock, monitor, mutex 3가지 방법이 있다.

 

lock을 이용한 동기화

//※메소드 내에서 object변수를 생성할 경우 스레드들이 해당 메소드에 들어올 때마다 새로운 object가 생성되어 스레드 동기화가 되지 않는다.
object lockObject = new object();
lock(lockObject)
{
	공유자원
}

 

Monitor 클래스를 이용한 동기화

메소드 내용
Enter() 지정된 개체의 잠금을 설정한다.
Exit() 지정된 개체의 잠금을 해제한다.
Pulse() 대기중인 큐에 포함된 스레드에게 잠겨있는 객체의 상태변경을 알린다.
PulseAll() 대기중인 모든 스레드에 개체의 상태변경을 알린다.
Wait() 개체의 잠금을 해제한뒤 잠감을 다시 가져올 때까지 현재 스레드를 차단한다.

 

object lockObject = new object();
Monitor.Enter(lockObject);
//임계영역
Monitor.Exit(lockObject);

 

Mutex를 이용한 동기화

//Mutex객체 생성
Mutex mtx = new Mutex(false, "mtxObj");

 

첫 번째 전달인자는 뮤텍스를 생성하는 스레드가 뮤텍스의 소유권

두 번째는 뮤텍스의 이름을 설정한다.

Mutex mtx = new Mutex(false, "MutexObj");
mtx.WaitOne();
mtx.ReleaseMutex();
반응형