2012년 12월 27일 목요일

Thread 동기화(Block,Lock)

쓰레드 동기화 문제에 대해 4가지 방법

1. Simple Blocking methods
특정시간의 경과하거나 다른스레드가 끝나기를 기다리여할떄
Sleep, Join and Task.Wait

2. Locking Constructs
제한된 여러 스레드가 실행되어질때 특정시간에 코드의 일부분(크리티컬섹션)을
읽거나 사용할때
하나의 스레드가 코드부분에 접근해야한다.
스레드들은 코드에 접근하기위해 경쟁을 해야하고 서로 방해가 된다.
lock(Monitor.Enter / Moniter.Exit), Mutex, SpinLock
The nonexclusive - Semaphore, SemaphoreSlim, reader/ writer locks.

3. Signaling constructs
스레드는 코드일부분을 사용하고 다른스레드에게 알려야한다.
event wait handles , Monitos' Wait/Pulse methods
Frmaework4.0 CountdownEvent , Barrier classes.

4. NOnblocking synchronization constructs
Thread.MemoryBarrier, Thread.VolatileRead, Thread.VolatileWrite, the volatile keyword, and the Interlocked class.

Blocking
unblocking 발생하는 4가지 방법에는
- 블록킹 조건(조건변수) 이 만족할떄
- 실행시간이 timing out
- Thread.Interrupt
- Thread.Abort
Thread.Suspend를 통한 block은 스레드가 간주하지 않는다.

같은 방법은..매우 wasteful -_- 좀 나아진다면

Locking
하나의 스레드가 코드의 일부분을 사용하는데 매우 유용하다
lock과 Mutex가 있는데 lock은 Mutex보다 빠르고 편리하다.
이 방법은 클래스가 스레드로부터 안전하지 않다.
두개의 스레드가 Go()메소드를 호출한다. 아마 division-by-zero Exception을 발생시킨다.
이유는 _val2 가 하나의 스레드 로부터 0으로 되고 다른스레드에서 이를 0으로 나누려고 했으니말이다.

자 lock을 이용해서 문제를 고쳐보자

오직 하나의 스레드만이 synchronizing objet ( in this case, _locker)특정시간에 접근하므로
다른 스레드에서는 lock의 해제될떄가지 블락을 당할것이다.
이때 블럭된 스레드의 상태 ThreadState 는 WaitSleepJoin 이다.
The Task Parallel Libarary (TPL) and PLINQ sufficiently powerful and high-level
닷넷 4.0 버전부터 TPL을 지원한다고 한다? 잘 모르지만 알아보자

댓글 없음:

댓글 쓰기