반응형
여러 개 Thread 사용 시 주의사항
(파라메터 주의)
For 문에서 여러 Thread 를 실행할 때
Thread 에 parameter 를 넘길때 주의할 점이 있습니다.
우선 코드를 보고 결과를 예상해 보세요.
using System;
using System.Collections.Generic;
using System.Threading;
namespace TestConsole
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
List<Thread> threadList = new List<Thread>();
for(int i=0; i < 100; i++)
{
Thread thread = new Thread(() => myThreadFunction(i));
threadList.Add(thread);
thread.Start();
}
foreach (Thread thread in threadList)
{
thread.Join();
}
Console.WriteLine("Done");
}
private static void myThreadFunction(int param)
{
Console.WriteLine("param = {0}", param);
}
}
}
0부터 99까지 돌면서 myThreadFunction에 그 값을 넘깁니다.
for(int i=0; i < 100; i++)
{
Thread thread = new Thread(() => myThreadFunction(i));
threadList.Add(thread);
thread.Start();
}
그리고 myThreadFunction 이라는 함수는 파라메터로 받은 숫자를 콘솔에 찍습니다.
0 부터 99 까지 순서없이 찍히겠죠?
라고 생각하셨으면 틀렸습니다.
실행해본 결과는
이렇습니다.
중복된 숫자가 많이 보이네요;;
위 코드를 아래와 같이 바꾸면 예상했던 결과가 나옵니다.
for(int i=0; i < 100; i++)
{
int index = i;
Thread thread = new Thread(() => myThreadFunction(index));
threadList.Add(thread);
thread.Start();
}
thread 라서 순서대로 나오지는 않지만 처음처럼 중복되는 오류는 발생하지 않습니다.
또는 ParameterizedThreadStart 를 사용합니다.
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
List<Thread> threadList = new List<Thread>();
for(int i=0; i < 100; i++)
{
int index = i;
//Thread thread = new Thread(() => myThreadFunction(index));
Thread thread = new Thread(new ParameterizedThreadStart(myThreadFunction)); // 이거 사용
threadList.Add(thread);
thread.Start(i); // start 에서 파라메터 넘기도록 수정
}
foreach (Thread thread in threadList)
{
thread.Join();
}
Console.WriteLine("Done");
}
public static void myThreadFunction(object param) // object type으로 수정
{
Console.WriteLine("param = {0}", param);
}
이 결과도, 중복없이 잘 실행됩니다.
ParameterizedThreadStart 또는 ThreadStart 참고
728x90
반응형
'C# 기술' 카테고리의 다른 글
[C#] Callback, Action으로 간단히 사용하기 (delegate 사용안함) (0) | 2021.11.25 |
---|---|
[C#] 크롤링에 유용한 라이브러리 HtmlAgilityPack (0) | 2021.10.31 |
[C#] Tuple 사용하기 (0) | 2021.10.20 |
[Selenium] “Element Is Not Clickable at Point” 해결방법 (0) | 2021.08.29 |
[C#] Tuple 사용 방법 (0) | 2021.06.01 |
댓글