본문 바로가기
프로그래밍

Thread 사용시 주의할 사항

by minimax95 2020. 5. 16.

프로그램 개발 시 Thread를 사용하는 이유는 프로그램 내에서 여러 가지 작업을 동시에 처리하기 위해서인데 Thread를 잘못 사용하면 성능이 저하되는 경우가 있습니다.

가장 흔한 경우로 스케줄링을 체크하거나 반복적으로 특정 기능을 수행하는 작업을 Thread에 위임할 경우 아래와 같이 Thread.Sleep()을 주지 않고 실행하게 되면 해당 Thread는 CPU를 붙잡고 무한 반복하면서 맡은 작업을 수행하게 됩니다.

 

MySchedule _mySchedule;               // 스케줄을 담는 멤버

Thread scheduleChkThread;             // 스케줄 체크 Thread

 

// 스케줄 시작

public void Start( )

{

    IsRunning = true;

    scheduleChkThread = new Thread(ScheuleChkFun);

    scheduleChkThread.Name = “ScheduleChk”

    scheduleChkThread.IsBackground = true;

    scheduleChkThread.Start( );

}

// 스케줄 처리기

private void ScheuleChkFun( )

{

    DateTime compareTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 

                                        DateTime.Now.Day, mySchedule.ChkHour, mySchedule.ChkMin, 0)

    while(IsRunning)

    {

        if(DateTime.Now.Day != compareTime.Day)  // 스케줄의 날짜를 현재 날짜로 보정

        {

            compareTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month,               

                                        DateTime.Now.Day, mySchedule.ChkHour, mySchedule.ChkMin, 0)

        }

        if(DateTime.Now < compareTime)

        {

            //Thread.Sleep(1000);

            continue;

        }

        else

        {

            // 스케줄 작업 수행(생략)        

        }

    }

}

 

소스코드를 분석해 보면 _mySchedule에 담긴 일정 시간을 기준으로 현재시간과 비교하여 수행 시간이 아니라면 continue를 통해 다음 스케줄 시간을 체크할 것입니다.

하지만 소스코드에서는 Thread.Sleep(1000)을 주석으로 처리하였기 때문에 위 소스코드에서는 거의 무한 반복으로 스케줄을 비교하며 한정된 자원을 소모하게 될 것입니다.

작업관리자에서 CPU 점유율을 보면 엄청난 자원이 소모되고 있는 것을 확인할 수 있습니다.

Thread.Sleep 미적용
Thread.Sleep 적용

 

이는 동일 컴퓨터 내의 다른 프로그램에도 영향을 미칠 수밖에 없으며 컴퓨터 전체 성능을 저하시키는 요인으로 작용할 수 있습니다. 따라서 Thread 사용시에는 적절하게 Thread.Sleep을 주어서 다른 Thread에게 작업을 양보하는 미덕이 필요합니다.

 

‘Thread.Sleep( )’ 우습게 보면 큰 코 다칠 수 있습니다.

 

지금까지 Thread 사용시 주의해야 할 사항에 대해 간단히 알아보았습니다.

감사합니다.

댓글