> 백엔드 개발 > C++ > C# 다중 스레드 클로저에서 'foreach' 변수를 직접 사용하는 것이 안전한가요?

C# 다중 스레드 클로저에서 'foreach' 변수를 직접 사용하는 것이 안전한가요?

Barbara Streisand
풀어 주다: 2025-01-22 06:56:12
원래의
684명이 탐색했습니다.

Is Using the `foreach` Variable Directly in C# Multi-threaded Closures Safe?

foreach C#의 변수 및 멀티스레드 클로저: 안전한가요?

foreach을 사용하여 C#에서 컬렉션을 반복하는 경우, 특히 다중 스레드 환경에서 반복 변수의 범위와 동작을 이해하는 것이 중요합니다.

다음 코드 조각은 멀티 스레딩에서 foreach 변수를 클로저 인수로 직접 사용하는 것이 안전한지, 그리고 각 반복마다 로컬 복사본을 만들어야 하는지 여부를 살펴봅니다.

C# 5 이전 버전

C# 5 이전 버전에서는 foreach 변수가 루프 외부에서 선언되었습니다. 이는 단일 변수 인스턴스가 모든 반복에서 공유된다는 것을 의미합니다.

첫 번째 코드 조각을 고려하세요.

<code class="language-csharp">foreach (Foo f in ListOfFoo)
{      
    Thread thread = new Thread(() => f.DoSomething());
    threads.Add(thread);
    thread.Start();
}</code>
로그인 후 복사

이 예에서 f 변수는 루프 반복 중에 생성된 모든 스레드에서 공유됩니다. 여러 스레드가 Foo의 서로 다른 인스턴스에서 메서드를 호출하거나 동일한 인스턴스에서 메서드를 여러 번 호출하게 되므로 이로 인해 예측할 수 없는 결과가 발생할 수 있습니다.

이러한 문제를 방지하려면 두 번째 코드 조각에 표시된 대로 각 반복마다 f 변수의 로컬 복사본을 만드는 것이 좋습니다.

<code class="language-csharp">foreach (Foo f in ListOfFoo)
{      
    Foo f2 = f;
    Thread thread = new Thread(() => f2.DoSomething());
    threads.Add(thread);
    thread.Start();
}</code>
로그인 후 복사

C# 5 이상

C# 5에는 중요한 변화가 도입되었습니다. C# 5 이상에서는 foreach 변수가 루프 범위 내에서 정의됩니다. 이는 각 반복마다 고유한 변수 인스턴스가 있음을 의미합니다.

따라서 두 코드 조각은 동등하고 안전해집니다. 이제 각 스레드에는 클로저 범위 내에서 자체 f 인스턴스가 있어 혼란이나 불일치의 위험이 제거됩니다.

위 내용은 C# 다중 스레드 클로저에서 'foreach' 변수를 직접 사용하는 것이 안전한가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿