몽상실현개발주의

[따배씨] 12.19 멀티 쓰레딩 본문

Language/C

[따배씨] 12.19 멀티 쓰레딩

migrationArc 2021. 6. 15. 23:33

[따배씨] 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

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

 

 

Comments