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 중국어 웹사이트의 기타 관련 기사를 참조하세요!