안녕하세요.
시작하세요 c# 7.1 교재의 444페이지 부근의 lock 사용 예를 공부하다가 의문점이 생겨서 질문 드립니다.
lock문에 객체를 넘겨주는 이유를 잘 모르겠습니다.
아래 코드의 //A 부분을 Program pg = new Program(); 으로 하고
//B부분을 lock(pg) { 로 변경해도 동일한 결과(공유자원에 대한 스레드 동기화 처리가 되는)를 얻게 되더군요.
왜 lock이나 Monitor.Enter에 어떠한 객체를 넘겨주는지, 넘길 때 어떠한 객체를 넘겨야 된다는 기준이 있는 것인지 궁금합니다.
감사합니다.
--------------------------------------------------------------------------------------------------------------------
namespace SevenTest
{
class MyData
{
int number = 0;
public int Number { get { return number; } }
public object _numberLock = new object(); // A
public void Icrement()
{
lock (_numberLock) { //B
number++;
}
}
}
class Program
{
static void Main(string[] args)
{
MyData data = new MyData();
Thread t1 = new Thread(threadFunc);
Thread t2 = new Thread(threadFunc);
t1.Start(data);
t2.Start(data);
t1.Join();
t2.Join();
Console.WriteLine(data.Number);
}
static void threadFunc(object inst)
{
MyData data = inst as MyData;
for(int i = 0; i < 100000; i++)
{
data.Icrement();
}
}
}
}
[최초 등록일: ]
[최종 수정일: 6/9/2019]