Chapter 4: Threads and Concurrency
Programming Challenge
Parallelism
Data parallelism
Task parallelism
single processor(core)의 concurrency = scheduler
암달의 법칙 : 코어는 무조건 많을 수록 좋은가?
S : serial portion
N : processing cores
→ 100% parallel portion이 아니라면 core의 개수는 큰 의미 X
portion
Parallel portion 병렬
→ 코어가 N개면 Parallel은 N배 성능 향상 기대
Serial portion 직렬
#include <pthread.h>
#include <stdio.h>
int sum; // thread에 의해 공유되는 변수
void *runner(void *param) {
int upper = atoi(param);
sum = 0;
for (int i = 1; i <= upper; i++) sum += i;
pthread_exit(0);
}
// $gcc -pthread test.c
int main(int argc, char *argv[]) {
pthread_t tid; //thread 식별자
pthread_attr_t attr; //thread attritubute 집합
pthread_attr_init(&attr); //default attributes 얻기
pthread_create(&tid, &attr, runner, argv[1]); //thread 생성
pthread_join(tid, NULL); //thread 끝날 때까지 기다리기
printf("sum = %d\n", sum);
}
pid_t pid;
pid = fork();
if (pid == 0) {
fork();
thread_create(...);
}
fork();
//process 6개, thread 2개
#include <windows.h>
#include <stdio.h>
DWORD sum; // thread에 의해 공유되는 변수
DWORD WINAPI Summation(LPVOID param) {
DWORD Upper = *(DWORD*)Param;
for (DWORD i = 0; i <= Upper; i++) sum += i;
}
int main (int argc, char *argv[]) {
DWORD ThreadId;
HANDLE ThreadHandle;
int Param;
ThreadHandle = CreateThread(
NULL, // security attributes
0, // stack size
Summation, // thread function
&Param, // thread function parameter
0, // creation flags
&ThreadId); // thread 식별자 리턴
if (ThreadHandle != NULL) {
WaitForSingleObject(ThreadHandle, INFINITE);
CloseHandle(ThreadHandle);
printf("sum = %d\n", sum);
}
}
class Summation implements Runnable {
public Summation(int upper, Sum sumValue) { ... }
public void run() { ... }
}
public class Driver {
public static void main(String[] args) {
Thread thrd = new Thread(new Summation(..));
thrd.start();
thrd.join();
}
}
DWORD WINAPI PoolFunction(AVOID Param) {
...
}
#include <stdio.h>
#include <omp.h>
// $gcc -fopenmp test.c
int main(int argc, char *argv[]) {
omp_set_num_threads(4); // 4개의 thread 생성
#pragma omp parallel
{
... //parallel region
printf("OpenMP thread: %d\n", omp_get_thread_num());
}
}
모든 thread 복제?
하나의 main thread만 가지는 프로세스로 복제?
→ 일부 Unix 시스템에서는 두 가지 버전 모두 지원
pthread_t tid;
pthread_create(&tid, 0, worker, NULL);
...
pthread_cancel(tid);