멀티 스레드프로그래밍싱글 스레드 프로그래밍에 비해 독특한 문제가 있는데, 바로 스레드 안전성 문제입니다. 소위 스레드 안전이란 코드가 있는 프로세스에서 동시에 실행 중인 여러 스레드가 있는 경우 이러한 스레드가 이 코드를 동시에 실행할 수 있음을 의미합니다. 각 실행의 결과가 단일 스레드 실행의 결과와 동일하고 다른 변수 의 값도 예상과 동일한 경우입니다. 스레드 안전 문제는 전역 변수와 정적 변수로 인해 발생합니다.
멀티 스레드 상황에서 정적 변수에 액세스하는 보안을 보장하기 위해 아래와 같이 잠금 메커니즘을 사용하여 이를 보장할 수 있습니다.
//필요한 정적 전역 변수
private static bool _isOK = false; //lock只能锁定一个引用类型变量 private static object _lock = new object(); static void MLock() { //多线程 new System.Threading.Thread(Done).Start(); new System.Threading.Thread(Done).Start(); Console.ReadLine(); } static void Done() { //lock只能锁定一个引用类型变量 lock (_lock) { if (!_isOK) { Console.WriteLine("OK"); _isOK = true; } } }
Lock은 참조 유형의 객체만 잠글 수 있다는 점에 유의해야 합니다. 또한 잠금 메커니즘 외에도 C#의 상위 버전에는 스레드 안전성을 보장하기 위해 아래와 같이 async 및 Wait 메서드가 추가되었습니다.
public static class AsynAndAwait { //step 1 private static int count = 0; //用async和await保证多线程下静态变量count安全 public async static void M1() { //async and await将多个线程进行串行处理 //等到await之后的语句执行完成后 //才执行本线程的其他语句 //step 2 await Task.Run(new Action(M2)); Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId); //step 6 count++; //step 7 Console.WriteLine("M1 Step is {0}", count); } public static void M2() { Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId); //step 3 System.Threading.Thread.Sleep(3000); //step 4 count++; //step 5 Console.WriteLine("M2 Step is {0}", count); } }
타이밍 다이어그램에서 알 수 있는 것은
async 및 wait를 사용한 후 위 코드의 실행 순서는 아래 그림과 같습니다.
각 스레드에 전역 변수와 정적 변수에 대한 읽기 작업만 있고 쓰기 작업은 없는 경우 일반적으로 이 전역 변수는 스레드로부터 안전합니다. 동시에 변수 읽기 쓰기 작업은 일반적으로 스레드 동기화를 고려해야 합니다. 그렇지 않으면 스레드 안전성이 영향을 받을 수 있습니다
위 내용은 C#이 멀티스레딩에서 스레드 안전성을 보장하는 방법을 공유하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!