C#

[C#] 람다식을 이용한 스레드 정의

겨울꿈개발자 2020. 9. 5. 19:08

기존에 작성한 코드에서 실행 시간을 줄여야 하는 상황이 있었습니다.

기존 코드는 아래와 같습니다.

 

if ( 0 != SomeFunction(1, 2, 3) )

{

   Set(false);

   return -1;

}

 

if ( 0 != SomeFunction(4, 5, 6) )

{

   Set(false);

   return -1;

}

 

위 코드에서 SomeFunction 함수를 한번씩 호출하는데, 해당 함수가 실행 시간이 걸립니다.

해당 함수는 동시에 호출해도 큰 문제가 없습니다.

따라서 스레드로 정의해서 두 함수를 동시에 호출하면 실행 시간을 줄일 수 있습니다.

 

또한 해당 함수 중 하나라도 실행 결과가 0이 아니면 -1을 리턴해야 합니다.

스레드는 따로 리턴을 하지 않기 때문에 내부에서 해당 함수의 리턴을 받아야 할 필요가 있습니다.

 

이를 위해 아래 두 url을 참고하였습니다.

stackoverflow.com/questions/1314155/returning-a-value-from-thread

 

Returning a value from thread?

How do I return a value from a thread?

stackoverflow.com

stackoverflow.com/questions/1195896/threadstart-with-parameters

 

ThreadStart with parameters

How do you start a thread with parameters in C#?

stackoverflow.com

스레드의 기본 사용 문법은 아래와 같습니다.

 

Thread thread1 = new Thread(FunctionName);

thread1.Start();

 

스레드 클래스를 생성할 때 인자로 함수를 전달해주면

Start() 메소드를 호출할 때, 인자로 전달한 함수를 스레드를 통해 실행합니다.

 

람다식은 함수를 정의하는 방법입니다.

"(a, b) => a + b" 와 같이 C#에서는 =>를 기준으로 좌항은 인자, 우항은 식으로 람다식을 정의합니다.

 

아래와 같이 코드를 수정하였습니다.

 

// 스레드 배열 및 함수 결과 저장할 int 배열 정의

Thread[] threads = new Thread[2];

int[] threadReturns = new int[thread.Length];

 

// 첫번째 스레드 정의

threads[0] = new Thread( () =>

   {

      threadReturns[0] = SomeFunction(1, 2, 3);

   }

);

 

// 두번째 스레드 정의

threads[1] = new Thread( () =>

   {

      threadReturns[0] = SomeFunction(4, 5, 6);

   }

);

 

// 스레드 시작

for (int i = 0; i < threads.Length; i++)

{

   threads[i].Start();

}

 

// 스레드가 모두 끝날때까지 대기

for (int i = 0; i < threads.Length; i++)

{

   threads[i].Join();

}

 

// 스레드 내 함수 리턴값이 모두 정상인지 확인

for (int i = 0; i < threads.Length; i++)

{

   if (threadReturns[i] != 0)

   {

      Set(false);

      return -1;

   }

}

 

기존 코드에서 스레드로 실행할 부분을 람다식을 이용해서 정의합니다.

이때 각 함수들의 리턴값은 int 배열에 저장합니다.

스레드들을 바로 실행하고,

Join() 메소드를 통해 모든 스레드가 끝날때까지 대기한 후에

스레드 내부에서 저장한 int 배열 값을 통해 리턴값을 확인합니다.

 

결과적으로 시간을 줄일 수 있었습니다.