C#의 멀티스레딩 메커니즘에 대한 예비 연구(4)
exPRession은 추적하려는 개체(일반적으로 개체 참조)를 나타냅니다. 일반적으로 클래스의 인스턴스를 보호하려면 이것을 사용할 수 있습니다. 정적 변수(예: 정적 메서드 내의 상호 배타적 코드 세그먼트)를 보호하려면 일반적으로 클래스 이름을 사용합니다. state_block은 상호 배타적인 섹션의 코드입니다. 이 코드는 한 번에 하나의 스레드에서만 실행될 수 있습니다.
다음은 lock 키워드를 사용하는 일반적인 예입니다. 댓글에서 lock 키워드의 사용법과 목적을 설명하겠습니다.
//lock.cs
시스템 사용; = new Random();
내부 계정(int 초기)
= 초기; }
internal int Withdraw(int amount)
{
if (balance < 0)
{
//잔액이 0보다 작은 경우 예외를 발생시킵니다.
throw new Exception("Negative Balance")
//다음 코드는 현재 스레드가 잔액 값 수정을 완료하기 전에
//다른 스레드가 이를 실행하지 않도록 합니다. 잔액 값을 수정하는 코드
//따라서 잔액 값은 0보다 작을 수 없습니다.
lock (this)
{
Console.WriteLine("Current Thread:"+Thread.CurrentThread.Name);
//lock 키워드로 보호되지 않는 경우 ,
//다른 스레드가 잔액=잔액-금액을 실행하고 잔액 값을 수정한 경우
조건을 판단한 후 실행될 수 있습니다. //그리고 이 수정 사항은 이 스레드에 표시되지 않으므로 현재로서는 if 조건이 더 이상 유지되지 않을 수 있습니다.
//그러나 이 스레드는 계속해서 Balance=balance-amount를 실행하므로 잔액은 0보다 작을 수 있습니다.
(잔액 >= 금액)
{
Thread.Sleep(5 );
balance = 잔액 - 금액 🎜>else
return 0; // 거래 거부됨 }
}
}
internal void DoTransactions()
{ for (int i = 0; i Withdraw(r.Next( -50, 100));
}
}
내부 클래스 테스트
{
정적 내부 스레드[] 스레드 = 새 스레드[10]
public static void Main()
{
계정 계정 = 새 계정(0); for (int i = 0; i {
Thread t = new Thread(new ThreadStart( acc.DoTransactions))
스레드[i] = t;
}
for (int i = 0; i threads[i].Name=i.ToString()
for (int i = 0; 10; i++)
threads[ i].Start()
Console.ReadLine()
} }
여러 스레드가 객체를 공유하는 경우 공개 코드와 유사한 문제도 발생합니다. 이러한 종류의 문제에는 lock 키워드를 사용하면 안 됩니다. System.Threading. 모니터는 스레드가 리소스 계획을 공유하는 방법을 제공합니다.
Monitor 클래스는 객체를 잠글 수 있습니다. 스레드는 잠금을 획득한 경우에만 객체에 대해 작업을 수행할 수 있습니다. 개체 잠금 메커니즘은 혼란을 야기할 수 있는 상황에서 한 번에 하나의 스레드만 이 개체에 액세스할 수 있도록 보장합니다. 모니터는 특정 객체와 연결되어야 하지만 정적 클래스이기 때문에 객체를 정의하는 데 사용할 수 없으며, 해당 메서드도 모두 정적이므로 객체를 사용하여 참조할 수 없습니다. 다음 코드는 Monitor를 사용하여 객체를 잠그는 방법을 보여줍니다.
......
Queue oQueue=new Queue()
..... .
Monitor.Enter(oQueue);
......//이제 oQueue 객체는 현재 스레드로만 조작할 수 있습니다.
Monitor.Exit(oQueue); //잠금 해제
위에 표시된 것처럼 스레드가 개체를 잠그기 위해 Monitor.Enter() 메서드를 호출하면 개체는 해당 개체의 소유가 됩니다. 다른 스레드가 이 개체에 액세스하려는 경우 해당 개체가 해당 개체를 사용할 때까지 기다려야 합니다. Monitor.Exit() 메서드 잠금을 해제합니다. 스레드가 결국 잠금을 해제하도록 하려면 try-catch-finally 구조의 finally 코드 블록에 Monitor.Exit() 메서드를 작성할 수 있습니다. 모니터에 의해 잠긴 개체의 경우 이와 관련된 일부 정보가 메모리에 저장됩니다. 하나는 현재 잠금을 보유하고 있는 스레드에 대한 참조이고, 다른 하나는 잠금을 획득할 준비가 된 개체를 저장하는 준비 대기열입니다. 세 번째 스레드는 현재 객체의 상태가 변경되기를 기다리고 있는 큐에 대한 참조를 보유하는 대기 큐입니다. 개체 잠금을 소유한 스레드가 잠금을 해제할 준비가 되면 Monitor.Pulse() 메서드를 사용하여 대기 대기열의 첫 번째 스레드에 알리므로 개체 잠금이 해제되면 스레드가 준비 대기열로 전송됩니다. , 준비 대기열에서 스레드는 즉시 개체 잠금을 획득할 수 있습니다.
다음은 스레드 동기화 및 통신을 달성하기 위해 lock 키워드와 Monitor 클래스를 사용하는 방법을 보여주는 예입니다. 이는 또한 일반적인 생산자 및 소비자 문제이기도 합니다. 이 루틴에서는 생산자 스레드와 소비자 스레드가 번갈아 가며 숫자를 쓰고, 소비자는 이를 즉시 읽고 표시해 줍니다. 사용된 시스템 네임스페이스는 다음과 같습니다.
using System;
using System.Threading
위는 C#의 멀티스레딩 메커니즘(4)의 내용입니다. 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











C#을 사용한 Active Directory 가이드. 여기에서는 소개와 구문 및 예제와 함께 C#에서 Active Directory가 작동하는 방식에 대해 설명합니다.

C#의 액세스 수정자에 대한 안내입니다. 예제 및 출력과 함께 C#의 액세스 한정자의 소개 유형에 대해 논의했습니다.

C#의 난수 생성기 가이드입니다. 여기서는 난수 생성기의 작동 방식, 의사 난수 및 보안 숫자의 개념에 대해 설명합니다.

C# 데이터 그리드 뷰 가이드. 여기서는 SQL 데이터베이스 또는 Excel 파일에서 데이터 그리드 보기를 로드하고 내보내는 방법에 대한 예를 설명합니다.

C# StringReader에 대한 안내입니다. 여기에서는 C# StringReader에 대한 간략한 개요와 다양한 예제 및 코드와 함께 작동하는 방법에 대해 설명합니다.

C# StringWriter 가이드. 여기에서는 C# StringWriter 클래스에 대한 간략한 개요와 다양한 예제 및 코드와 함께 작동하는 방법에 대해 설명합니다.
