족쇄

pthreads

일반적으로 pthreads로 알려진 POSIX 스레드는 언어와 독립적으로 존재하는 실행 모델일 뿐만 아니라 병렬 실행 모델이다.그것은 프로그램이 시간에 겹치는 여러 가지 다른 작업 흐름을 제어할 수 있게 해준다.각 작업 흐름을 스레드라고 하며, 이러한 흐름에 대한 생성과 통제는 POSIX 스레드 API에 호출함으로써 이루어진다. POSIX 스레드 스레드(Srads)는 표준 POSIX.1c, 스레드 확장(IEEEE Std 1003.1c-1995)에 의해 정의된 API이다.

API 구현은 FreeBSD, NetBSD, OpenBSD, Linux, MacOS, Android,[1] Solaris, RedoxAUTOSAR Adaptive와 같은 많은 유닉스 유사 POSIX 호환 운영 체제에서 사용할 수 있으며, 일반적으로 라이브러리 libpthread로 번들로 제공된다.DR-DOS마이크로소프트 윈도우즈 구현도 존재한다. 즉, 다수의 POSIX API의 네이티브 구현을 제공하는 SFU/SUA 하위 시스템 내, 기존 윈도우즈 API 위에 pthreads를 구현하는 [2]pthreads-w32와 같은 타사 패키지 내에도 존재한다.

내용물

pthreads는 C 프로그래밍 언어 유형, 함수 및 상수의 집합을 정의한다.다음과 같이 구현된다.pthread.h머리글 및 스레드 라이브러리.

약 100개의 스레드 절차가 있으며, 모두 접두사가 있음pthread_그리고 그들은 네 개의 그룹으로 분류될 수 있다.

POSIX 세마포어 API는 POSIX 스레드와 함께 작동하지만 POSIX.1b, 실시간 확장(IEEE 규격 1003.1b-1993) 표준에 정의된 스레드 표준의 일부가 아니다.따라서 세마포어 절차는 다음과 같이 접두사가 된다.sem_대신에pthread_.

C에서 pthread의 사용을 보여주는 예:

#include <stdio.h> #include <stdlib.h> #include <assert.h> #include << pthread>.h> #include <유니스트드>.h>  #Define NUM_THREAD  공허하게 하다 *수행하다_일하다(공허하게 하다 *논쟁들){   인트로 색인을 달다 = *((인트로 *)논쟁들);   인트로 sleep_time = 1 + 랜드() % NUM_THREADs;   활자화하다("THRAD %d: 시작됨.\n", 색인을 달다);   활자화하다("THRED %d: %d초간 절전 모드임.\n", 색인을 달다, sleep_time);   잠을 자다(sleep_time);   활자화하다("THRED %d: 종료됨.\n", 색인을 달다);   돌아오다 NULL; }  인트로 본래의(공허하게 하다) {   pthread_t [NUM_THREADs];   인트로 나사산_아그스[NUM_THREADs];   인트로 i;   인트로 result_code;      //모든 스레드를 하나씩 생성   을 위해 (i = 0; i < NUM_THREADs; i++) {     활자화하다("주: %d 스레드를 만드는 중.\n", i);     나사산_아그스[i] = i;     result_code = pthread_create(&[i], NULL, 수행하다_일하다, &나사산_아그스[i]);     주장하다(!result_code);   }    활자화하다("인 메인: 모든 스레드가 생성된다.\n");    //각 스레드가 완료될 때까지 기다리십시오.   을 위해 (i = 0; i < NUM_THREADs; i++) {     result_code = pthread_message([i], NULL);     주장하다(!result_code);     활자화하다("IN Main: 스레드 %d이(가) 종료됨.\n", i);   }    활자화하다("메인 프로그램이 끝났다.\n");   돌아오다 0; } 

이 프로그램은 5개의 스레드를 만들고, 각각 이 스레드의 고유 번호를 표준 출력으로 출력하는 perform_work를 실행한다.만약 프로그래머가 스레드가 서로 통신하기를 원한다면, 이것은 함수의 범위 밖에 있는 변수를 정의하여 글로벌 변수로 만들 필요가 있을 것이다.이 프로그램은 다음 명령으로 gcc 컴파일러를 사용하여 컴파일할 수 있다.

gcc pthreads_snow.c -pthread -o pthreads_snow

여기 이 프로그램을 실행함으로써 가능한 많은 출력물 중 하나가 있다.

주: 스레드 0 만들기주: 스레드 1 만들기주: 스레드 2 만들기주: 스레드 3 만들기.스레드 0: 시작됨주: 스레드 4 만들기스레드 3: 시작됨.스레드 2: 시작됨스레드 0: 3초간 잠을 잔다.스레드 1: 시작됨.스레드 1: 5초간 잠을 잔다.스레드 2: 4초간 잠을 잘 것이다.스레드 4: 시작됨스레드 4: 1초간 잠을 잔다.주: 모든 스레드가 생성됨.스레드 3: 4초간 잠을 잘 것이다.스레드 4: 종료됨.스레드 0: 종료됨.In Main: 스레드 0이 종료됨.스레드 2: 종료됨.스레드 3: 종료됨.스레드 1: 종료됨.In Main: 스레드 1이 종료됨.In Main: 스레드 2가 종료됨.인 메인: 스레드 3이 종료되었다.In Main: 스레드 4가 끝났다.메인 프로그램이 종료되었다. 

Windows용 POSIX 스레드

윈도우는 기본적으로 pthreads를 지원하지 않기 때문에 pthreads4w 프로젝트는 휴대용 오픈 소스 포장지 구현을 제공하고자 한다.또한 윈도 플랫폼에 대한 수정이 거의 또는 전혀 없이 유닉스 소프트웨어(pthreads를 사용하는)를 포팅하는 데도 사용할 수 있다.[3]Apache Public License v2.0에 따라 출시된 Pthreds4w 버전 3.0.0 이상은[4] 64비트 또는 32비트 윈도우즈 시스템과 호환된다.LGPLv3 라이센스에 따라 출시된 [5]버전 2.11.0도 64비트 또는 32비트 호환이 가능하다.

Mingw-w64 프로젝트에는 Pthreads4w 프로젝트보다 더 많은 네이티브 시스템 호출을 사용하려고 하는 pthreads, winpthreads의 포장지 구현도 포함되어 있다.[6]

윈도우즈 Services for UNIX/Subsystem for UNIX-based Applications 패키지에서 사용할 수 있는 인터릭스 환경 하위 시스템은 pthreads API의 네이티브 포트를 제공한다. 즉, Win32/Win64 API에 매핑되지 않고 운영 체제 syscall 인터페이스에 직접 구축되어 있다.[7]

참고 항목

참조

  1. ^ "libc/bionic/pthread.c - platform/bionic - Git at Google". android.googlesource.com.
  2. ^ "Pthread Win-32: Level of standards conformance". 2006-12-22. Retrieved 2010-08-29.
  3. ^ Hart, Johnson M. (2004-11-21). "Experiments with the Open Source Pthreads Library and Some Comments". Archived from the original on 2010-08-30. Retrieved 2010-08-29.
  4. ^ https://sourceforge.net/projects/pthreads4w/files/ -- 파일: pthreads4w-code-v3.0.0.zip -- pthreads4w v3.0.0의 소스
  5. ^ https://sourceforge.net/projects/pthreads4w/files/ -- 파일: pthreads4w-code-v2.11.0.zip -- pthreads4w v2.11.0의 소스
  6. ^ http://locklessinc.com/articles/pthreads_on_windows을 참조하라. http://locklessinc.com/articles/pthreads_on_windows은 원래 http://locklessinc.com/articles/pthreads_on_windows에서 유래된 것이다.
  7. ^ "Chapter 1: Introduction to Windows Services for UNIX 3.5".

추가 읽기

외부 링크