#운영체제 #study
Chapter 4. Thread & Concurrency (Part 2)
Figure 4.11/Multithreaded C program using the Pthread API./
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
/* the data shared by the threads */
int sum;
/* thread call this function */
void * runner(void *param);
int main(int argc, char *argv[])
{
pthread_t tid; // thread identifier
pthread_attr_t attr; // thread attributes
pthread_attr_init(&attr);
//Java의 new Thread와 동일
 pthread_create(&tid, &attr, runner, argv[1]);
//위 스레드가 종료될 때까지 대기하다가 이어서 진행한다.
pthread_join(tid, NULL);
printf("sum = %d\n", sum);
}
//Java의 public vod run() 메서드와 동일, *param으로 argv[1] 전달
void * runner(void *param)
{
int i, upper = atoi(param);
sum = 0;
//1~N까지 합 구하는 로직
for (i = 0; i <= upper; i++)
sum += i;
//스레드 종료 명령어?
pthread_exit(0);
}
#include <stdio.h>
#include <unistd.h>
#include <wait.h>
#include <pthread.h>
//전역 변수
int value = 0;
void * runner(void *param);
int main(int argc, char *argv[])
{
pid_t pid;
pthread_t tid;
pthread_attr_t attr;
pid = fork(); //프로세스 생성
if (pid == 0) { // child process
pthread_attr_init(&attr);
pthread_create(&tid, &attr, runner, NULL);
pthread_join(tid, NULL);
printf("CHILD: value = %d\n", value); // LINE C
}
else if (pid > 0) { // parent process
wait(NULL);
printf("PARENT: value = %d\n", value); // LINE P
}
}
void *runner(void *param)
{
value = 5;
pthread_exit(0);
}
출력 결과
CHILD: value = 5
PARENT: value = 0
-> 프로세스 내에서 전역 변수는 스레드 사이에 공유된다.
#include <stdio.h>
#include <omp.h>
int main(int argc, char *argv[])
{
#pragma omp parallel // compiler directive
{
//이 블록 안의 코드는 병렬로 수행한다.
printf("I am a parallel region.\n");
}
return 0;
}
#include <stdio.h>
#include <omp.h>
int main(int argc, char *argv[])
{
//스레드 갯수 지정
omp_set_num_threads(4);
#pragma omp parallel
{
//스레드 번호 조회
printf("OpenMP thread: %d\n", omp_get_thread_num());
}
return 0;
}
출력 결과
OpenMP thread: 3
OpenMP thread: 0
OpenMP thread: 2
OpenMP thread: 1
#include <stdio.h>
#include <omp.h>
#define SIZE 100000000
int a[SIZE], b[SIZE], c[SIZE];
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < SIZE; i++)
a[i] = b[i] = i;
#pragma omp parallel for
for (i = 0; i < SIZE; i++) {
c[i] = a[i] + b[i];
}
return 0;
}
수행 시간
real 0m0.586s
user 0m0.364s
sys 0m0.223s
real 0m0.423s
user 0m1.091s
sys 0m0.441s