Posix 스레드 프로그래밍 안내서 (1) 스레드 생성 및 취소

5660 단어 프로그래밍
스레드 생성
1.1 스레드 및 프로세스
프로세스에 비해 루틴은 집행체에 더욱 가까운 개념으로 같은 프로세스의 다른 루틴과 데이터를 공유할 수 있지만 자신의 창고 공간을 가지고 독립된 집행 서열을 가진다.직렬 프로그램을 바탕으로 라인과 프로세스를 도입하는 것은 프로그램의 병발도를 높이고 프로그램의 운행 효율과 응답 시간을 높이기 위한 것이다.
루틴과 프로세스는 사용에 있어 각각 장단점이 있다. 루틴의 집행 비용은 적지만 자원의 관리와 보호에 불리하다.과정은 정반대다.또한 스레드는 SMP 시스템에서 실행하기에 적합하며 프로세스는 시스템 간에 마이그레이션할 수 있습니다.
1.2 스레드 생성
POSIX가 pthread를 통해create() 함수는 다음과 같이 정의된 스레드를 생성합니다.
int  pthread_create(pthread_t  *  thread, pthread_attr_t * attr, 

void * (*start_routine)(void *), void * arg)


 
fork () 호출로 프로세스를 만드는 방법과 달리 pthreadcreate () 에서 만든 루틴은 주 루틴 (즉 pthread create () 을 호출하는 루틴) 과 같은 실행 시퀀스를 가지지 않고 start 를 실행합니다.routine 함수.thread는 만든 루트 ID를 되돌려줍니다.attr는 루트를 만들 때 설정한 루트 속성입니다. (아래 참조)pthread_create () 의 반환값은 루틴 생성이 성공했는지 여부를 나타냅니다.비록arg는void*유형의 변수이지만, 또한 임의의 유형의 매개 변수로start 에 전달할 수 있습니다routine () 함수;동시에 startroutine ()는void* 형식의 반환값을 되돌릴 수 있으며, 이 반환값은 다른 형식일 수도 있으며 pthreadjoin () 을 가져옵니다.
1.3 스레드 생성 속성
pthread_create()의 attr 매개 변수는 구조 포인터로 구조의 요소는 각각 새 스레드의 운행 속성에 대응하며 주로 다음과 같은 몇 가지를 포함한다.
__detachstate, 새 스레드가 프로세스의 다른 스레드와 동기화되지 않았는지 표시합니다. 위치를 설정하면 pthread 를 사용할 수 없습니다.join () 을 동기화하고 종료할 때 사용하는 자원을 스스로 방출합니다.기본값은 PTHREAD 입니다.CREATE_JOINABLE 상태.이 속성도 라인을 만들고 실행한 후 pthreaddetach()로 설정하고 PTHREAD 로 설정하면CREATE_DETACH 상태(작성 시 설정 또는 런타임 설정에 관계없이)는 PTHREAD 로 다시 복원할 수 없습니다.CREATE_JOINABLE 상태.
__schedpolicy, SCHED 를 비롯한 새로운 스레드의 스케줄링 정책을 나타냅니다.OTHER(일반, 비실시간), SCHEDRR(실시간, 회전법) 및 SCHEDFIFO(실시간, 선입선출) 세 가지, 기본값은 SCHEDOTHER 이후 두 가지 스케줄링 정책은 수퍼유저에게만 적용됩니다.실행 시 pthread 사용 가능setschedparam () 으로 변경합니다.
__schedparam, struct sched 1개param 구조, 현재 sched 하나만 있음priority 정형 변수는 라인의 운행 우선순위를 표시합니다.이 매개변수는 스케줄러 정책이 실시간(즉, SCHED RR 또는 SCHED FIFO)일 때만 유효하며 실행 시 pthreadsetschedparam () 함수를 변경합니다. 기본값은 0입니다.
__inheritsched, PTHREADEXPLICIT_SCHED 및 PTHREADINHERIT_SCHED, 전자는 새 스레드가 명시적으로 지정한 스케줄링 정책과 스케줄링 매개 변수 (즉 attr의 값) 를 사용하고, 후자는 호출자의 스레드를 계승하는 값을 표시합니다.기본값은 PTHREAD 입니다.EXPLICIT_SCHED.
__scope는 스레드 간 경쟁 CPU의 범위를 나타낸다. 즉, 스레드 우선순위의 유효한 범위를 말한다.POSIX의 표준에는 PTHREAD 라는 두 가지 값이 정의되어 있습니다.SCOPE_SYSTEM 및 PTHREADSCOPE_PROCESS는 시스템의 모든 스레드와 함께 CPU 시간을 경쟁하는 것을 의미하며, 후자는 같은 프로세스의 스레드와만 CPU 시간을 경쟁하는 것을 의미한다.현재 LinuxThreads는 PTHREAD 만 구현하였습니다.SCOPE_SYSTEM 1값.
pthread_attr_t 구조에는 일부 값이 있지만 pthread 를 사용하지 않습니다.create()로 설정합니다.
이러한 속성을 설정하기 위해 POSIX는 pthread 를 포함한 일련의 속성 설정 함수를 정의했습니다.attr_init()、pthread_attr_destroy () 및 각 속성과 관련된 pthreadattr_get---/pthread_attr_set---함수.
1.4 스레드 생성 Linux 구현
리눅스의 루틴 실현은 핵 밖에서 이루어지고 핵 내에서 제공하는 것은 프로세스를 만드는 인터페이스dofork().커널은 두 개의 시스템 호출을 제공한다clone () 와 fork (), 최종적으로 다른 매개 변수로do 호출fork () 핵내 API.물론 루틴을 실현하려면 다중 프로세스(사실 경량급 프로세스) 공유 데이터 세그먼트에 대한 핵심 지원이 없으면 안 되기 때문에dofork()는 CLONE 을 비롯한 다양한 매개변수를 제공합니다.VM(공유 메모리 공간), CLONEFS(파일 시스템 정보 공유), CLONEFILES(공유 파일 설명자 테이블), CLONESIGHAND(공유 신호 핸들 테이블) 및 CLONEPID(공유 프로세스 ID, 코어 내부 프로세스, 즉 0번 프로세스에만 유효).fork 시스템 호출을 사용할 때, 핵 호출dofork()는 공유 속성을 사용하지 않으며 프로세스는 독립된 운행 환경을 가지고 있으며 pthread 를 사용합니다create () 로 라인을 만들 때, 최종적으로 모든 속성을 설정해서clone (), 이 매개 변수는 모두 핵 내의do 에 전송됩니다fork () 를 통해 생성된 프로세스는 공유된 실행 환경을 가지고 있으며, 창고만 독립되어 있습니다.clone () 입력.
리눅스 루틴은 핵 내에 경량급 프로세스 형식으로 존재하며 독립된 프로세스 테이블 항목을 가지고 있으며 모든 창설, 동기화, 삭제 등 작업은 핵 밖 pthread 라이브러리에서 진행된다.pthread 라이브러리는 프로세스마다 독립적이고 유일한 관리 루트 ( pthread manager () 를 사용하여 루트의 생성과 종료를 관리하고 루트의 ID를 분배하며, 루트와 관련된 신호 (예를 들어 Cancel) 를 보내고, 주 루트 (pthread create () 의 호출자는 파이프를 통해 요청한 정보를 관리 루트에 전달합니다.
 
맨 위로
스레드 취소
2.1 스레드 취소 정의
일반적인 상황에서 루틴은 주체 함수가 종료될 때 자동으로 종료되지만, 다른 루틴이 보낸 종료 (취소) 요청을 받아서 강제로 종료될 수도 있다.
2.2 라인 취소의 의미
스레드를 취소하는 방법은 목표 스레드에 Cancel 신호를 보내는 것이지만 Cancel 신호를 어떻게 처리하는지는 목표 스레드가 스스로 결정하거나 무시하거나 즉시 종료하거나 Cancelation-point(취소점)로 계속 운행하거나 서로 다른 Cancelation 상태에 의해 결정된다.
스레드가 CANCEL 신호를 받는 기본 처리(즉 pthread create()가 스레드를 생성하는 기본 상태)는 취소점까지 계속 실행됩니다. 즉, CANCELED 상태를 설정하고 스레드가 계속 실행되며 Cancelation-point에 실행될 때만 종료됩니다.
2.3 취소점
POSIX 표준에 따라 pthreadjoin()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait(), sigwait() 등의 함수와 read(), write() 등 차단을 일으키는 시스템 호출은 모두 Cancelation-point이며, 다른 pthread 함수는 Cancelation 동작을 일으키지 않는다.하지만 pthreadcancel의 매뉴얼 페이지는 Linux Thread 라이브러리와 C 라이브러리의 결합이 좋지 않기 때문에 현재 C 라이브러리 함수는Cancelation-point가 아니라고 주장한다.그러나 CANCEL 신호는 차단된 시스템 호출에서 스레드를 종료하고 EINTR 오류 코드를 설정하기 때문에 Cancelation-point가 필요한 시스템 호출 전후에 pthread 를 호출할 수 있습니다POSIX 표준에 필요한 목표인 다음 코드 세그먼트에 도달하기 위해 testcancel()
pthread_testcancel();

    retcode = read(fd, buffer, length);

    pthread_testcancel();

 
2.4 프로그램 설계에 대한 고려
만약 루틴이 무한 순환 중이고 순환 체내에서 취소점까지의 필연적인 경로가 실행되지 않으면 루틴은 외부의 다른 루틴의 취소 요청으로 중지될 수 없습니다.따라서 이런 순환체의 필수 경로에pthread 를 넣어야 한다testcancel () 호출.
2.5 스레드 취소와 관련된 pthread 함수
int pthread_cancel(pthread t thread)은thread 스레드에 종료 신호를 보내며 성공하면 0을 반환하고 그렇지 않으면 0이 아닙니다.발송이 성공했다고 thread가 종료되는 것은 아닙니다.
int pthread_setcancelstate(int state, int *oldstate)는 이 스레드가 Cancel 신호에 대한 반응을 설정합니다.state에는 두 가지 값이 있습니다:PTHREADCANCEL_ENABLE(기본값) 및 PTHREADCANCEL_DISABLE는 신호를 받은 후 CANCLED 상태로 설정하고 CANCEL 신호를 무시하여 계속 운행하는 것을 나타낸다.old_state가 NULL이 아닌 경우 복원하기 위해 원래 Cancel 상태가 저장됩니다.
int pthread_setcanceltype(int type, int *oldtype)은 이 스레드가 동작을 취소할 때를 설정합니다. type은 두 가지 값을 가져옵니다: PTHREADCANCEL_DEFFERED 및 PTHREADCANCEL_ASYCHRONOUS는 Cancel 상태가 Enable일 때만 유효하며 신호를 받은 후 다음 취소점까지 계속 운행한 다음에 종료하고 취소 동작을 즉시 실행(종료)하는 것을 의미한다.oldtype이 NULL이 아닌 경우 가져온 취소 동작 유형 값이 저장됩니다.
void pthread_testcancel(void)
이 스레드가 Canceld 상태인지 확인한 후 취소 작업을 수행합니다. 그렇지 않으면 바로 반환됩니다.

좋은 웹페이지 즐겨찾기