CLOSE SEARCH
POSTS TAGGED WITH: Thread

Thread in C#

멀티태스킹과 프로세스, 스레드

멀티태스킹은 윈도우가 지원하는 많은 기능 중 하나로 동시에 여러개의 프로그램들이 실행될 수 있도록 해준다. 이때, 실행중인 프로그램들은 프로세스로 관리된다. 프로세스가 실행된 후에는 운영체제에서 자동적으로 멀티태스킹을 지원해 준다. 하나의 프로세스는 기본적으로 하나의 스레드를 가지며 필요한 경우 다수의 스레드를 가질 수 있다. 스레드는 프로세스 내에서 실행되는 하나의 함수로 이해해도 좋다. 일반적으로 프로세스는 특정 시점에 하나의 함수(메인스레드)만을 수행하지만 스레드를 통해 다수의 함수를 동시에 실행할 수 있다.

동시에 여러개의 함수가 실행될 경우 이들의 실행순서와 동기화에 신경을 써야한다.

 

스레드의 상태

스레드는 아래와 같은 4가지 상태를 갖는다.

  • Unstarted : 스레드가 생성되었지만 아직 실행되기 전
  • Runnable : 스레드 생성 후 Start() 를 호출하면 Runnable 상태가 되며 CLR에 의해 큐(실행 큐) 형태로 관리된다. 그 후 시스템에 의해 우선순위에 따라 실행된다. 오직 실행큐에 있는 스레드만이 CPU 사용권한을 가진다. 
  • Suspended : 실행중인 스레드에서 Suspend()나 Sleep() 함수를 호출할 경우 해당 스레드는 실행 큐에서 대기 큐로 이동되며 CPU 사용 권한을 상실한다. Resume() 함수를 호출하거나 지정된 대기 시간이 지나면 다시 Runnable 상태가 될 수 있다. 
  • Stopped : 스레드가 실행을 마친 후에 리턴되거나 실행중 Abort()를 호출한 경우
스레드의 현재 상태를 알아보기 위해서는 Thread 클래스의 ThreadState 속성을 얻는다. 이 속성은 아래와 같은 값들을 가질 수 있다.
  • Unstarted
  • Running
  • WaitSleepJoin
  • SuspendRequest
  • Suspended
  • AbortRequested
  • Stopped
스레드의 상태를 조작하는데 사용되는 함수는 다음과 같다.
  • public void Start() : 스레드를 시작한다.
  • public bool Join(int millisecondsTimeout) : 스레드가 종료되기까지 대기한다.
  • public void Suspend() : 스레드를 대기상태로 변경한다.
  • public void Resume() : 스레드를 재시작한다. 
  • public static void Sleep(int millisecondsTimeout) : 지정된 시간만큼 대기한다. 
  • public void Abort() : 스레드를 종료한다. 

[MFC] Using Workerthread

[sourcecode language=”cpp”]

CWinThread* pThread = ::AfxBeginThread(ThreadFunc, &param);

UINT ThreadFunc(LPVOID pParam)

{

return 0;

}

//스레드 종료 후 특정 작업 처리

if ( ::WaitForSingleObject(pThread->m_hThread, INFINITE))

{

// … 처리해야 할 작업들 …

}

//지정한 시간 후 스레드 처리

DWORD dwCode = ::WaitForSingleObject(pThread->m_hThread, 7000);

if (dwCode == WAIT_OBJECT_0)

{

// … 스레드 종료 후 수행할 작업들…

}

else if (dwCode == WAIT_TIMEOUT

{

// … 7000ms 후 스레드가 종료되지 않을 경우 에러처리 작업 …

}

//스레드 실행 여부 확인

if ( ::WaitForSingleObject(pThread->m_hThread, 0) == WAIT_TIMEOUT )

{

// … 스레드 실행 중 …

}

else

{

/// … 스레드 실행 중이 아님 …

}

[/sourcecode]

Using Thread