맨위로가기

POSIX 스레드

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

POSIX 스레드(Pthreads)는 C 프로그래밍 언어에서 사용할 수 있는 스레드 제어 함수들의 모음으로, 스레드를 생성, 관리하고 동기화하는 데 사용되는 데이터 형식, 함수, 상수를 정의한다. pthread.h 헤더 파일과 스레드 라이브러리로 구현되며, 스레드 관리, 뮤텍스, 조건 변수, 동기화, 스핀락, 스레드 로컬 데이터 관련 함수들을 제공한다. Pthreads는 C 언어의 표준은 아니지만, 여러 운영 체제에서 지원되며, Windows 환경에서는 Pthreads4w 프로젝트를 통해 사용할 수 있다.

더 읽어볼만한 페이지

  • C POSIX 라이브러리 - 포크 (시스템 호출)
    포크는 유닉스 계열 운영체제에서 새로운 프로세스를 생성하는 시스템 호출로, 호출 시 부모 프로세스의 복사본인 자식 프로세스가 생성되어 파일 서술자를 상속받으며, 유닉스 철학의 핵심 개념으로 필터 개발 및 파이프라인 구축에 용이하고 vfork, rfork, clone 등 다양한 변종이 존재한다.
  • C POSIX 라이브러리 - 글로브 (프로그래밍)
    글로브는 파일 이름 패턴을 해석하고 확장하는 기능으로, 유닉스 와일드카드 확장에서 시작하여 다양한 프로그래밍 환경에서 파일 검색 및 문자열 패턴 매칭에 활용되며, 와일드카드 문자를 사용하여 여러 파일이나 문자열을 선택하는 단순하고 직관적인 구문을 제공한다.
  • 스레드 - 멀티스레딩
    멀티스레딩은 프로세스 내에서 여러 스레드를 동시 실행하여 처리 능력을 향상시키는 기술로, 응답성 향상과 자원 공유 등의 장점이 있지만, 자원 간섭과 소프트웨어 복잡성 증가 등의 단점도 존재하며, 다양한 모델과 구현 방식, 스레드 스케줄러, 가상 머신 활성화 가능성 등을 고려해야 한다.
  • 스레드 - 동시 멀티스레딩
    동시 멀티스레딩(SMT)은 슈퍼스칼라 구조 기반으로 한 클럭 사이클 내에 여러 스레드의 명령어를 동시에 실행하여 CPU 자원 활용률을 높이는 기술이지만, 자원 경합, 성능 저하, 보안 취약점 등의 단점도 있으며, 인텔 하이퍼 스레딩이 대표적이다.
  • 병렬 컴퓨팅 - 슈퍼컴퓨터
    슈퍼컴퓨터는 일반 컴퓨터보다 훨씬 높은 성능을 가진 컴퓨터로, 복잡한 계산과 시뮬레이션을 수행하며, 프로세서, 메모리, 스토리지, 네트워크 등으로 구성되어 병렬 처리를 통해 높은 성능을 구현하고, 군사, 기상 예측, 과학 기술 분야, 인공지능 등 다양한 분야에서 활용되고 있다.
  • 병렬 컴퓨팅 - 컴퓨터 클러스터
    컴퓨터 클러스터는 여러 대의 상용 컴퓨터를 고속 네트워크로 연결하여 고성능 컴퓨팅 시스템을 구축하는 방식으로, 슈퍼컴퓨터를 포함한 다양한 분야에서 높은 가용성과 확장성을 제공하며, 클러스터 미들웨어를 통해 시스템 관리, 부하 분산, 통신 방식, 데이터 공유 등을 지원하고 노드 장애 관리를 위한 펜싱 기술을 활용한다.
POSIX 스레드

2. 설명

Pthread는 C 언어 프로그래밍에서 사용할 수 있는 함수들의 모음이다. Pthread 라이브러리에서 제공하는 함수는 `pthread.h`를 포함하여 호출할 수 있다.

Pthread는 스레드 제어를 위한 다양한 함수를 제공하며, 제공되는 함수의 목록은 [http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Thread/Beginning/PthreadApiReference Pthread API Reference]에서 확인할 수 있다. 구현은 `pthread.h`라는 헤더 파일과 스레드 라이브러리에 있다. 스레드 슬립은 `unistd.h`의 `sleep()` 또는 `time.h`의 `nanosleep()`을 사용한다.

동기화 함수는 뮤텍스, 조건 변수 등을 제공한다.

유틸리티 함수로는 스레드 ID 비교 (`pthread_equal()`), 리소스 해제 (`pthread_detach()`), 자신의 스레드 ID 확인 (`pthread_self()`) 등이 있다.

2. 1. 자료형

POSIX 스레드는 C 프로그래밍 언어에서 사용 가능한 자료형, 함수, 상수의 집합으로, `pthread.h` 헤더 파일과 스레드 라이브러리를 통해 구현된다.

Pthread 라이브러리에서 제공하는 주요 자료형은 다음과 같다.

자료형설명
`pthread_t`스레드 핸들러
`pthread_attr_t`스레드 속성
`pthread_mutex_t`뮤텍스
`pthread_mutexattr_t`뮤텍스의 속성
`pthread_cond_t`조건 변수
`pthread_condattr_t`조건 변수의 속성


2. 2. 주요 기능

POSIX 스레드(pthread)는 C 프로그래밍 언어에서 사용할 수 있는 함수들의 모음으로, `pthread.h` 헤더와 스레드 라이브러리로 구현된다. 약 100개의 스레드 프로시저가 있으며, 모두 `pthread_`로 시작한다.

주요 기능은 다음과 같이 분류할 수 있다.

  • 스레드 관리: 스레드 생성, 결합 등. (자세한 내용은 스레드 관리 하위 섹션 참조)
  • 뮤텍스: 스레드 간 상호 배제를 위한 기능. (자세한 내용은 동기화 하위 섹션 참조)
  • 조건 변수: 특정 조건이 충족될 때까지 스레드를 대기시키는 기능. (자세한 내용은 동기화 하위 섹션 참조)
  • 동기화: 읽기-쓰기 잠금 및 장벽 사용. (자세한 내용은 동기화 하위 섹션 참조)
  • 스핀락
  • 스레드별 데이터(Thread-Specific Data): 스레드별 데이터를 지원한다. (자세한 내용은 스레드별 데이터 하위 섹션 참조)


POSIX 세마포어 API는 POSIX 스레드와 함께 작동하지만 스레드 표준의 일부는 아니며, ''POSIX.1b, 실시간 확장 (IEEE Std 1003.1b-1993)'' 표준에 정의되어 있다. 따라서 세마포어 프로시저는 `pthread_` 대신 `sem_`으로 시작한다.

Pthread 라이브러리에서 제공하는 함수는 `pthread.h`를 포함하여 호출할 수 있다.[1]
자료형

자료형설명
`pthread_t`스레드 핸들러
`pthread_attr_t`스레드 속성
`pthread_mutex_t`뮤텍스
`pthread_mutexattr_t`뮤텍스의 속성
`pthread_cond_t`조건 변수
`pthread_condattr_t`조건 변수의 속성


주요 함수함수의 인수는 생략한다.[1]

분류함수설명
스레드 조작`pthread_create()`스레드 생성
`pthread_exit()`현재 스레드 종료
`pthread_cancel()`지정된 스레드의 실행을 취소
`pthread_join()`현재 스레드를 다른 스레드가 종료될 때까지 블록
`pthread_kill()`스레드로 신호 전송
`pthread_attr_init()`, `pthread_attr_destroy()`, `pthread_attr_getdetachstate()`, `pthread_attr_setdetachstate()`스레드 속성 관리
유틸리티`pthread_equal()`두 스레드 ID가 같은지 확인
`pthread_detach()`스레드에 리소스 해제
`pthread_self()`자신의 스레드 ID 얻기


2. 2. 1. 스레드 관리

POSIX 스레드는 스레드 생성, 결합 등을 다루는 함수들을 제공한다. POSIX 스레드 표준은 약 100개의 스레드 프로시저를 정의하며, 이들은 모두 `pthread_`로 시작한다.

스레드 관리는 스레드의 생성, 종료, 결합 등 기본적인 스레드 운영을 위한 기능들을 포함한다. 주요 함수는 다음과 같다.

  • `pthread_create()`: 새로운 스레드를 생성한다.
  • `pthread_exit()`: 현재 실행 중인 스레드를 종료한다.
  • `pthread_cancel()`: 지정된 스레드의 실행을 취소한다.
  • `pthread_join()`: 특정 스레드가 종료될 때까지 현재 스레드를 대기시킨다.
  • `pthread_kill()`: 스레드에 신호를 보낸다.
  • `pthread_attr_init()`, `pthread_attr_destroy()`, `pthread_attr_getdetachstate()`, `pthread_attr_setdetachstate()`: 스레드 속성을 관리하는 함수들이다.


다음은 C 언어에서 pthreads를 사용하여 스레드를 생성하고 관리하는 예시이다.

```c

#include

#include

#include

#include

#include

#define NUM_THREADS 5

void *perform_work(void *arguments){

int index = *((int *)arguments);

int sleep_time = 1 + rand() % NUM_THREADS;

printf("스레드 %d: 시작.\n", index);

printf("스레드 %d: %d 초 동안 잠들 예정입니다.\n", index, sleep_time);

sleep(sleep_time);

printf("스레드 %d: 종료.\n", index);

return NULL;

}

int main(void) {

pthread_t threads[NUM_THREADS];

int thread_args[NUM_THREADS];

int i;

int result_code;

// 모든 스레드를 하나씩 생성

for (i = 0; i < NUM_THREADS; i++) {

printf("메인에서: 스레드 %d 생성.\n", i);

thread_args[i] = i;

result_code = pthread_create(&threads[i], NULL, perform_work, &thread_args[i]);

assert(!result_code);

}

printf("메인에서: 모든 스레드 생성 완료.\n");

// 각 스레드가 완료될 때까지 대기

for (i = 0; i < NUM_THREADS; i++) {

result_code = pthread_join(threads[i], NULL);

assert(!result_code);

printf("메인에서: 스레드 %d 종료.\n", i);

}

printf("메인 프로그램 종료.\n");

return 0;

}

```

위 코드는 5개의 스레드를 생성하고, 각 스레드는 `perform_work` 함수를 실행한다. `pthread_create` 함수는 새로운 스레드를 생성하고, `pthread_join` 함수는 생성된 스레드가 종료될 때까지 기다린다.

이 프로그램은 gcc 컴파일러를 사용하여 다음과 같이 컴파일할 수 있다.

```bash

gcc pthreads_demo.c -pthread -o pthreads_demo

2. 2. 2. 동기화

POSIX 스레드는 뮤텍스, 조건 변수, 읽기-쓰기 잠금, 장벽 등을 이용한 동기화 기능을 제공한다.[1]

뮤텍스 관련 함수는 다음과 같다.[1]

  • `pthread_mutex_init()`: 뮤텍스 락을 초기화한다.
  • `pthread_mutex_destroy()`: 뮤텍스 락을 파기한다.
  • `pthread_mutex_lock()`: 뮤텍스 락을 획득한다. (블록)
  • `pthread_mutex_trylock()`: 뮤텍스 락을 획득한다. (블록하지 않음)
  • `pthread_mutex_unlock()`: 뮤텍스 락을 해제한다.
  • `pthread_mutex_getprioceiling()`:
  • `pthread_mutex_setprioceiling()`:


조건 변수 관련 함수는 다음과 같다.[1]

  • `pthread_cond_init()`: 조건 변수를 초기화한다.
  • `pthread_cond_destroy()`: 조건 변수를 파기한다.
  • `pthread_cond_signal()`: 조건 변수에 신호를 보낸다.
  • `pthread_cond_broadcast()`:
  • `pthread_cond_wait()`: 조건 변수에서 대기한다.
  • `pthread_cond_timedwait()`:
  • `pthread_condattr_init()`:
  • `pthread_condattr_destroy()`:
  • `pthread_condattr_getpshared()`:
  • `pthread_condattr_setpshared()`:


읽기/쓰기 잠금 관련 함수는 다음과 같다.[1]

  • `pthread_rwlock_init()`:
  • `pthread_rwlock_destroy()`:
  • `pthread_rwlock_rdlock()`:
  • `pthread_rwlock_wrlock()`:
  • `pthread_rwlock_tryrdlock()`:
  • `pthread_rwlock_trywrlock()`:
  • `pthread_rwlock_unlock()`:
  • `pthread_rwlockattr_init()`:
  • `pthread_rwlockattr_destroy()`:
  • `pthread_rwlockattr_getpshared()`:
  • `pthread_rwlockattr_setpshared()`:

2. 2. 3. 스레드별 데이터 (Thread-Specific Data)

POSIX 스레드는 스레드별 데이터를 지원한다.

  • `pthread_key_create()`: 스레드별 데이터와 연관시킬 키를 생성한다.
  • `pthread_key_delete()`: 키를 파기한다.
  • `pthread_getspecific()`: 키를 지정하여 스레드별 데이터를 검색한다.
  • `pthread_setspecific()`: 키와 스레드별 데이터를 연결한다.[1]

3. 예제

다음은 C 언어에서 pthreads를 사용하는 예시이다.

```c

#include

#include

#include

#include

#include

#define NUM_THREADS 5

void *perform_work(void *arguments){

int index = *((int *)arguments);

int sleep_time = 1 + rand() % NUM_THREADS;

printf("스레드 %d: 시작.\n", index);

printf("스레드 %d: %d 초 동안 잠들 예정입니다.\n", index, sleep_time);

sleep(sleep_time);

printf("스레드 %d: 종료.\n", index);

return NULL;

}

int main(void) {

pthread_t threads[NUM_THREADS];

int thread_args[NUM_THREADS];

int i;

int result_code;

// 모든 스레드를 하나씩 생성

for (i = 0; i < NUM_THREADS; i++) {

printf("메인에서: 스레드 %d 생성.\n", i);

thread_args[i] = i;

result_code = pthread_create(&threads[i], NULL, perform_work, &thread_args[i]);

assert(!result_code);

}

printf("메인에서: 모든 스레드 생성 완료.\n");

// 각 스레드가 완료될 때까지 대기

for (i = 0; i < NUM_THREADS; i++) {

result_code = pthread_join(threads[i], NULL);

assert(!result_code);

printf("메인에서: 스레드 %d 종료.\n", i);

}

printf("메인 프로그램 종료.\n");

return 0;

}

```

이 프로그램은 다섯 개의 스레드를 생성하며, 각 스레드는 해당 스레드의 고유 번호를 표준 출력에 출력하는 함수 ''perform_work''를 실행한다. 프로그래머가 스레드 간에 통신을 원할 경우, 이것은 어떤 함수의 범위 밖에서 변수를 정의하여 전역 변수로 만드는 것을 필요로 할 것이다. 이 프로그램은 다음 명령으로 gcc 컴파일러를 사용하여 컴파일할 수 있다.

```bash

gcc pthreads_demo.c -pthread -o pthreads_demo

```

다음은 이 프로그램을 실행했을 때 나올 수 있는 출력 예시이다.

```text

메인에서: 스레드 0 생성.

메인에서: 스레드 1 생성.

메인에서: 스레드 2 생성.

메인에서: 스레드 3 생성.

스레드 0: 시작.

메인에서: 스레드 4 생성.

스레드 3: 시작.

스레드 2: 시작.

스레드 0: 3 초 동안 잠들 예정입니다.

스레드 1: 시작.

스레드 1: 5 초 동안 잠들 예정입니다.

스레드 2: 4 초 동안 잠들 예정입니다.

스레드 4: 시작.

스레드 4: 1 초 동안 잠들 예정입니다.

메인에서: 모든 스레드 생성 완료.

스레드 3: 4 초 동안 잠들 예정입니다.

스레드 4: 종료.

스레드 0: 종료.

메인에서: 스레드 0 종료.

스레드 2: 종료.

스레드 3: 종료.

스레드 1: 종료.

메인에서: 스레드 1 종료.

메인에서: 스레드 2 종료.

메인에서: 스레드 3 종료.

메인에서: 스레드 4 종료.

메인 프로그램 종료.

```

다음은 C 언어로 Pthreads를 사용한 또 다른 코드 예시이다.

```c

#include

#include

#include

static void *thread_func(void *vptr_args) {

int i;

for (i = 0; i < 20; i++) {

fputs(" b\n", stderr);

sleep(1);

}

return NULL;

}

int main(void) {

int i;

pthread_t thread;

if (pthread_create(&thread, NULL, thread_func, NULL) != 0) {

return EXIT_FAILURE;

}

for (i = 0; i < 20; i++) {

puts("a");

sleep(1);

}

if (pthread_join(thread, NULL) != 0) {

return EXIT_FAILURE;

}

return EXIT_SUCCESS;

}

```

이 프로그램은 'b'를 1초마다 20번 표시하는 새로운 스레드를 생성하고, 동시에 메인 스레드는 'a'를 1초마다 20번 표시한다. 출력은 두 개의 스레드가 병행 동작하여 'a'와 'b'가 뒤섞인 형태가 된다.

4. Windows 환경에서의 Pthreads

Windows는 pthreads 표준을 기본적으로 지원하지 않으므로, Pthreads4w 프로젝트는 이식 가능하고 오픈 소스인 래퍼 구현을 제공하고자 한다. 또한, pthreads를 사용하는 유닉스 소프트웨어를 Windows 플랫폼으로 거의 수정 없이 또는 전혀 수정 없이 이식하는 데 사용할 수 있다.[4] 아파치 공용 라이선스 v2.0으로 출시된 Pthreads4w 버전 3.0.0[5] 이상은 64비트 또는 32비트 Windows 시스템과 호환된다. LGPLv3 라이선스 하에 출시된 버전 2.11.0[6]도 64비트 또는 32비트와 호환된다.

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

유닉스 기반 응용 프로그램용 Windows 서비스/하위 시스템 패키지에서 사용할 수 있는 Interix 환경 하위 시스템은 pthreads API의 네이티브 포트를 제공하며, Win32 API에 매핑되지 않고 운영 체제 시스템 콜 인터페이스에 직접 구축된다.[8]

참조

[1] 웹사이트 libc/bionic/pthread.c - platform/bionic - Git at Google https://android.goog[...]
[2] 웹사이트 Pthread Win-32: Level of standards conformance http://sources.redha[...] 2006-12-22
[3] 웹사이트 pthread.h(0p) — Linux manual page https://www.man7.org[...] 2022-12-18
[4] 웹사이트 Experiments with the Open Source Pthreads Library and Some Comments 2004-11-21
[5] 파일 File: pthreads4w-code-v3.0.0.zip – Source for pthreads4w v3.0.0 https://sourceforge.[...]
[6] 파일 File: pthreads4w-code-v2.11.0.zip – Source for pthreads4w v2.11.0 https://sourceforge.[...]
[7] 웹사이트 see http://locklessinc.com/articles/pthreads_on_windows which is where it was originally derived from http://locklessinc.c[...]
[8] 웹사이트 Chapter 1: Introduction to Windows Services for UNIX 3.5 https://technet.micr[...] 2007-12-05
[9] 웹사이트 POSIX Threads (pthreads) for Win32 https://www.sourcewa[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com