동기화 없는 쓰레드의 문제점 -----------------------------------------------------------------------------------

4개의 쓰레드가 각기의 연산을 한다고 했을때. 쓰레드들 사이의 메모리 전환이 단순히 프로그램의 라인라인 별로 이루어지지 않기 때문에 하나의 전역 변수를 가지고 다수의 쓰레드가 연산을 하게 된다면 그 연산과정에 있어서 CPU의 레지스터 값이 변경되는 순서가 프로그래머의 의도와는 다르게 움직인다.(아니 확실히 처음 쓰레드를 사용하는 사람의 생각과는 다르게 진행될 것이다.) 

LOAD & STORE 명령어를 제대로 이해했다면 이 부분이 이해될 것이다.


멀티 쓰레드 환경 ---------------------------------------------------------------------------------------------

멀티쓰레드 환경은 비쥬얼 2008버전에서 다음과 같이 설정이 가능하다.


또한 쓰레드 생성에 있어서 _beginthreadex 함수를 통해서 쓰레드를 생성해야 한다. 이함수와 일반 createthread 함수의 차이점은 한가지이다. _beginthreadex함수는 쓰레드 생성에 앞서서 생성하는 쓰레드를 위해서 독립적인 메모리 블록을 할당한다.

당연히 그 메모리 블록을 해제하기 위해서는 _endthreadex( unsigned retval )함수를 호출해야 한다.


쓰레드의 상태변화 --------------------------------------------------------------------------------------------

앞서 설명했던 그림을 한번더 깨내본다.

이 그림은 프로세스의 상태를 표현하기 위해서 예제가된 그림이지만 그 프로세스의 상태를 변경시키는 주체는 프로세스가 아니고 쓰레드 그 자체이다. 달라질 것은 없다. 프로세스안에 들어있는 쓰레드의 상태를 그대로 위의 그림과 연관시켜 생각해보면 간단하기 때문이다.

쓰레드가 생성되며 Start 상태가 되면 일단 ready상태가 되고 running 상태가 되길 기다린다. 그리고 running 상태로 실행중인 쓰레드에게 할당된 다임 슬라이스가 모두다 되면 다시 전환되고 자신이 cpu를 차지하지 않아도 되는 시점이 되면 blocked상태로 변하여 다른 쓰레드에게 CPU의 실행권한을 넘겨주고 다시 ready상태가 되면 된다.


상태변화 함수 --------------------------------------------------------------------------------------------

DWORD SuspendThread( HANDLE hThread ) 

쓰레드의 커널 오브젝트에는 SuspendThread 함수의 호출 빈도수를 기록하기 위한 서스팬드 카운트라 불리는 맴버가 존재한다.(Suspend Count) 현재 실행중인 쓰레드의 서스펜드 카운트는 0이다. 이 함수를 사용할때마다 Suspend Count를 1씩 증가시킨다고 보면 된다. 

Suspend Count는 당연히 반대로 감소시키는 함수가 존재한다.

DWORD ResumeThread( HANDLE hThread ) 

상태의 변화에 의한 내용은 다음과 같다.


Suspend Count가 의미하는 쓰레드의 상태 -----------------------------------------------------------------------

Suspend Count = 0 : 현재 실행중인 쓰레드(Ready)
Suspend Count > 0 : Block 상태

이 함수들은 변경되기 이전에 Suspend Count 를 리턴한다.

쓰레드의 우선순위 컨트롤 :
프로세스의 우선순위는 기존 우선순위라고 표현한다.
쓰레드는 추가로 상대적 우선순위를 갖는다.

 Priority  의미 
 THREAD_PRIORITY_LOWEST -2
 THREAD_PRIORITY_BELOW_NORMAL -1
 THREAD_PRIORITY_NORMAL 0 (Default)
 THREAD_PRIORITY_ABOVE_NORMAL +1
 THREAD_PRIORITY_HIGHEST

 +2



Posted by JJOREG