[CS] Thread - lock()

Sireal·2022년 4월 26일
0

C#

목록 보기
20/30

lock()

  • 동시에 여러 쓰레드에서 공유변수를 사용할 때 값이 뒤엉키거나 씹히는 문제가 발생한다.
  • 그래서 공유 object를 만들어서 한번에 한쓰레드만 공유변수 차례로 사용하게 만들수 있다.
  • lock(공유object){해당 코드, 공유변수} 이런식으로 하면,
    그 공유 object를 사용하는 쓰레드를 제외하고 모든쓰레드가 잠겨지게 된다.
  • lock(this.머시기) 이렇게 쓰면 절대 절대 안된다. 오히려 프로그램 망가진다.
using System;
using System.Threading;

namesapce MultiThrApp
{
	class MyClass
    {
    	private int coutner = 1000; // 공유변수
        private object lockObject = new object(); // lock문에 사용될 공유 object
        
        public void Run()
        {
        	// 10개의 쓰레드를 동일 메서드에서 실행
            for(int i - 0; i < 10; i++)
            {
            	new Thread(SafeCalc).Start();
            }
        }
        // Thread-Safe 메서드
        private void SafeCalc()
        {
        	// 한번에 한 쓰레드만 lock블럭 실행
        	lock(lockObject)
        	{
        		// 필드값 변경
        		counter++;

				// 가정 : 다른 복잡한 일을 한다(일부러 엉키게 했음)
            	for(int i = 0; i<counter; i++)
            		for(int j = 0; j<counter; j++)
            
            	// 필드값 읽기
            	Console.WriteLine(counter);
        	}
        }
    }
}
/*
출력:
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
*/

lock object를 이용하여 크리틱컬 섹션을 만들어서
쓰레드 관리를 보다 안전하게 할수 있게 됐다.

profile
🚄계속 앞으로🚄

0개의 댓글

관련 채용 정보