멀티 스레딩을 처음 사용하는 데 문제가 있습니다. 나는 그것이 어떻게 작동하는지 이해하기를 원한다. 그래서 나는 그것을 썼다.C에서 멀티 스레딩 문제를 파악할 수 없습니다.
internal abstract class PaySystem
{
public int payOperationTime;
public readonly object _payLock = new object();
public void Pay()
{
Console.WriteLine("There is a pay order in {0} pay system", GetType().Name);
if (Monitor.TryEnter(_payLock))
{
Console.WriteLine("{0} pay system is ready work, so we can start pay operation", GetType().Name);
}
else
{
Console.WriteLine("{0} pay system is locked now by other pay operation, so we need to wait for end of last", GetType().Name);
}
lock (_payLock)
{
Console.WriteLine("Start pay operation on {0} pay sytem", GetType().Name);
Console.WriteLine("payOperationTime for {0} paySystem will be {1}", GetType().Name, payOperationTime.ToString());
Thread.Sleep(payOperationTime);
}
Console.WriteLine("Pay done by {0} pay system", GetType().Name);
}
}
그래서, 내 홈페이지에() 메소드는 다음에 일어날 :
그래서, 클래스 PaySystem이
PayPal payPal = new PayPal();
Thread payPalPayment = new Thread(payPal.Pay);
Thread payPalPayment2 = new Thread(payPal.Pay);
payPalPayment.Start();
payPalPayment2.Start();
Console.ReadKey(true);
그리고 출력으로 나는 결과 (내게로) 예측할 수있다. 콘솔 출력의 printscreen을 파일로 첨부합니다.
는하지만, 몇 마디에, 그것은 첫 번째 스레드가 종료 한 후 두 번째 스레드가 지불을 계속할 것 같습니다.
제대로 이해하면 스레드를 시작할 수 있으며 사물함 잠금이 해제 될 때 사물함에 의해 잠겨져 실행되거나 도달되는 것을 차단할 수 있습니다.
내가 이해하지 못하거나 올바르게하지 않은 것을 설명 할 수 있습니까?
EDIT 1 개
내 질문은 왜 두 번째 스레드가없는 것입니다 contines 지불합니까? 잠긴 코드 블록의 행.
편집 2. 대답
내가 사물함 개체가 잠겨 있는지 확인하고 싶어, 내가 TryEnter() 메소드를 사용했다. 내가 도움이, 친애하는 stackoverflow 청중, 내 목적을 위해 IsEntered() 메서드를 사용해야합니다 알아낼.
감사합니다.
먼저 문제를 제대로 설명해 줄 수 있습니까? 그것을 얻는데 어려움을 겪고 있습니다. – Rahul
'PayPal'은 어디에 정의되어 있습니까? –
코드가 기대하는 바가 내게 명확하지 않습니다. 첫 번째 스레드는 먼저 잠금을 가졌으므로 잠금 내에서 작업을 수행했습니다. 두 번째 스레드가 잠겨있을 때까지 첫 번째 스레드는 이미 그것을 가지고 있습니다. – David