점점 많은 스레드를 가진 응용이 등장하게 되면서 이러한 응용을 설계하는 일이 어려워졌다.
이런 문제점을 해결하는 가장 좋은 방법은 스레딩의 생성과 관리 책임을 응용 개발자로부터 컴파일러와 실행시간 라이브러리에게 넘겨주는 것이다. 이것을 암묵적 스레딩이라고 한다.
이번에는 이런 암묵적 스레딩을 구현하는 방법에 대해 알아보자(총 4가지가 있지만 2가지만 소개한다)
[스레드 풀]
다중 스레드로 구성된 웹브라우저를 생각해보자. 웹 서버는 요청을 받을 때마다 그 요청을 처리하기 위해 새로운 스레드를 만들어 준다. 이런 방법의 문제는 1 ) 서비스할 때마다 스레드를 생성하는 데 시간이 소요된다. 2 ) 최대 스레드 수가 몇 개까지 가능할 수 있는 것인지 한계를 정해야한다.
이러한 문제점들을 해결하기 위해 스레드 풀은 일정한 수의 스레드들을 미리 만들어 이러한 문제점들을 해결한다.
[Windows 스레드 풀]
WINDOWS에서는 이러한 풀을 사용하기 위해 QueueUserWorkItem()함수를 호출한다.
QueueUserWorkItem(&PoolFunction, NULL, 0);
[Java 스레드 풀]
1 ) 단일 스레드 Executor, newSingleThreadExecutor()는 크기가 1인 풀을 생성한다.
2 ) 고정 스레드 Executor, newFixedThreadPool(int size)는 지정된 수의 스레드가 있는 스레드 풀을 생성한다.
3 ) 캐시 스레드 Executor, newCashedThreadPool()는 많은 경우 스레드를 재사용하는 무제한 스레드 풀을 생성한다.
[OpenMP]
OpenMp는 c,c++로 작성된 API와 컴파일러 디렉티브의 집합으로 공유 메모리 환경에서 병렬 프로그래밍을 할 수 있도록 도움을 준다.
병렬로 실행될 수 있는 블록을 찾아 병렬 영역이라고 부르면 응용 개발자는 이런 병렬 영역을 찾아 컴파일러 디렉티브를 삽입한다.
#include <omp.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
#pragma omp parallel
{
printf("I am a parallel region\n");
}
return 0;
}
pragma omp parallel을 만나면 시스템의 코어 개수만큼 스레드를 생성한다.
필자는 8개의 코어를 가지고 있으므로 8개의 출력문이 출련된다.