Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 따라하며 배우는 C언어
- 인프런
- JavaScript
- Algospot
- 종만북
- BOJ
- 따라하면서 배우는 C언어
- DP
- sorting
- Algorithm
- 정수론
- programmers
- Cleancode
- dfs
- php
- C언어
- server
- C
- Math
- graph
- 백준
- udemy
- greedy
- 따배씨
- BASIC
- web
- BFS
- 생활코딩
- String
- Python
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 12.19 멀티 쓰레딩 본문
따배씨 - 따라하며 배우는 C언어
12강 Storage Classes, Linkage and Memory Management
12.19 멀티 쓰레딩 Multi-Threading
- Process : 실행중에 있는 프로그램
- Process 내부에는 최소 하나의 Thread 를 가지고 있음, 실제로 Thread 단위로 스케줄링을 함
- 하드디스크에 있는 프로그램을 실행하면, 실행을 위한 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올가가게 됨. 이 순간부터 Process 라고 불림
- Thread : Process 내에서 실행되는 여러 흐름의 단위
- Process 의 특정한 수행 경로, 할당 받은 지원을 이용하는 실행 단위
- Thread 는 Process 내에서 각각 Stack 만 따로 할당받고, Code, Data, Heap 영역은 공유
- Multi Threading : 여러 Thread 로 병렬 작업
- 현존하는 거의 모든 CPU 는 Multi-Core Processer 로서, 최근에는 Multi-Threading 을 이용한 동시성 프로그래밍/병렬 처리 기술이 보편화 되어 있음
- 여러개의 Thread 가 하나의 함수를 동시에 실행 시킬 때, 메모리상에는 그 함수들을 실행 시키기 위한 데이터 카피본(사용되는 변수들)이 동시에 생성됨
- 하나의 전역변수를 여러개의 Thread 가 동시에 접근해서 사용 할 때, Memory 상의 값이 연산 도중에 다른 Thread 에 의해 변경되는 문제가 발생 할 수 있음
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // sleep()
#include <pthread.h>
#include <stdatomic.h> // _Atomic
_Atomic int acnt = 0; // atomic type qualifer (C11)
// A normal C function that is executed as a thread
// when its name is spectified in pthread_create()
void* myThreadFun(void *vgrap){
int n = 1; // thread storage duration
for (int j = 0; j < 1; ++j){
sleep(2);
acnt += 1;
printf("Printing from Thread %d %llu \n", acnt, (unsigned long long)&n);
}
return NULL;
}
int main(){
pthread_t thread_id1, thread_id2;
printf("Before Thread\n");
// Before Thread
pthread_create(&thread_id1, NULL, myThreadFun, NULL);
// Printing from Thread 2 123145379876772
pthread_create(&thread_id2, NULL, myThreadFun, NULL);
// Printing from Thread 1 123145380413348
pthread_join(thread_id1, NULL);
pthread_join(thread_id2, NULL);
printf("After Thread\n");
// After Thread
printf("Atomic %d \n", acnt);
// Atomic 2
return 0;
}
_Atomic int acnt = 0; // atomic type qualifer (C11)
- _Atomic 변수로 race conditon을 방지
- race condition : 여러 Thread 에서 여러 함수들이 실행이 될 때, 각각의 Thread 에서 동일한 변수를 접근 할때 일관성이 깨지는 문제가 발생 할 수 있음
- Atomic 연산은 일반 연산보다 느림
pthread_t thread_id1, thread_id2;
- Thread 의 식별, 내부적으로 Thread 의 변수 처럼 사용
pthread_create(&thread_id1, NULL, myThreadFun, NULL);
pthread_create(&thread_id2, NULL, myThreadFun, NULL);
- 새로운 Thread 에 myThreadFun 을 실행시키고 그 식별자를 thread_id1 으로 지정
- &thread_id1 - 함수의 매개변수로서 포인터를 사용
- 내부적으로 Thread 에 myThreadFun 함수 copy 두개가 작동하게 됨
pthread_join(thread_id1, NULL);
pthread_join(thread_id2, NULL);
- main 함수가 끝나면 다른 프로그램이 종료 되기 때문에, main Thread 가 다른 Thread 들이 종료 될 때 까지 기다림
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
http://blog.naver.com/atelierjpro
http://www.inflearn.com/course/following-c
'Language > C' 카테고리의 다른 글
[따배씨] 13.2 텍스트 파일 입출력 예제 (0) | 2021.06.16 |
---|---|
[따배씨] 13.1 파일 입출력의 작동 원리 (0) | 2021.06.16 |
[따배씨] 12.18 자료형 한정자들 const, volatile, restrict (0) | 2021.06.15 |
[따배씨] 12.17 동적 할당 메모리와 저장 공간 분류 (0) | 2021.06.15 |
[따배씨] 12.16 calloc(), realloc() (0) | 2021.06.15 |
Comments