>백엔드 개발 >C#.Net 튜토리얼 >C#이 멀티스레딩에서 스레드 안전성을 보장하는 방법을 공유하세요.

C#이 멀티스레딩에서 스레드 안전성을 보장하는 방법을 공유하세요.

Y2J
Y2J원래의
2017-04-17 16:43:192604검색

멀티 스레드프로그래밍싱글 스레드 프로그래밍에 비해 독특한 문제가 있는데, 바로 스레드 안전성 문제입니다. 소위 스레드 안전이란 코드가 있는 프로세스에서 동시에 실행 중인 여러 스레드가 있는 경우 이러한 스레드가 이 코드를 동시에 실행할 수 있음을 의미합니다. 각 실행의 결과가 단일 스레드 실행의 결과와 동일하고 다른 변수 의 값도 예상과 동일한 경우입니다. 스레드 안전 문제는 전역 변수와 정적 변수로 인해 발생합니다.

멀티 스레드 상황에서 정적 변수에 액세스하는 보안을 보장하기 위해 아래와 같이 잠금 메커니즘을 사용하여 이를 보장할 수 있습니다.

//필요한 정적 전역 변수

 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);
        }
}

타이밍 다이어그램에서 알 수 있는 것은

C#이 멀티스레딩에서 스레드 안전성을 보장하는 방법을 공유하세요.

async 및 wait를 사용한 후 위 코드의 실행 순서는 아래 그림과 같습니다.

C#이 멀티스레딩에서 스레드 안전성을 보장하는 방법을 공유하세요.

각 스레드에 전역 변수와 정적 변수에 대한 읽기 작업만 있고 쓰기 작업은 없는 경우 일반적으로 이 전역 변수는 스레드로부터 안전합니다. 동시에 변수 읽기 쓰기 작업은 일반적으로 스레드 동기화를 고려해야 합니다. 그렇지 않으면 스레드 안전성이 영향을 받을 수 있습니다

위 내용은 C#이 멀티스레딩에서 스레드 안전성을 보장하는 방법을 공유하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.