ft_philosopher

#20210721 Philosopher 시작

코딩클로스 2021. 7. 21. 21:37

2. 학습 목표

Philosopher과제 파악하기

 

3. 학습 방법

건우형한테 흐름 배우기

강의 듣기

https://www.youtube.com/watch?v=YAP0Bv_aQl8 

 

4. 다음 학습 목표

아직은 모르겠음. 과제를 파악하지 못함

 

5. 상세 학습 내용

철학자의 저녁식사 (Dining = Philosopher)

DeadLock (교착상태)의 개념

- 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태로, '교착 상태'라고도 하며 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생

 

DeadLock (교착상태)의 발생 조건

- 교착상태는 한 시스템 내에서 다음의 네 가지 조건이 동시에 성립할 때 발생함. 따라서, 아래의 네 가지 조건 중 하나라도 성립하지 않도록 만들면 교착 상태를 해결함

 

1) 상호 배제 (Mutual exclusion)

- 자원은 한 번에 한 프로세스만이 사용할 수 있어야 한다.

 

2) 점유 대기 (Hold and wait)

- 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 함

 

3) 비선점 (No preemption)

- 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야 한다.

 

4) 순환 대기

프로세스의 집합 {P0, P1, ~ Pn}에서 P0은 P1이 점유한 자원을 대기하고 P1은 P2가 점유한 자원을 대기하고 Pn-1은 Pn이 점유한 자원을 대기하며 Pn은 P0이 점유한 자원을 요구해야 한다.

 

스레드 사용해보기

#include <stdio.h>
#include <pthread.h>

typedef struct data
{
    int start;
    int end;
    int *sum;
} t_var;

int sum;
t_var var[2];
pthread_t th[2];

void *ft_sum(void *par)
{
     printf("쓰레드 가동\n");
    t_var *var;
    int i;

    var = (t_var *)par;
    i = var->start;

    while (i <= var->end)
    {
        // printf("%d\n", i);
        *(var->sum) += i;
        i++;
    }
    return NULL;
}


int main()
{
    int sum = 0;
    var[0].start = 1;
    var[0].end = 50;
    var[1].start = 51;
    var[1].end = 100;
    var[0].sum = &sum;
    var[1].sum = &sum;

    pthread_create(&th[0], NULL, ft_sum, &var[0]);
    printf("1");
    pthread_create(&th[1], NULL, ft_sum, &var[1]);
    // pthread_join(th[0], NULL);
    // pthread_join(th[1], NULL);
    printf("sum %d", sum);
}

 

 

pthread_join(th [0], NULL);을 사용하지 않는다면 th [0] 스레드와 th [1] 스레드가 실행되고 있는데

 

printf("sum % d", sum); 함수를 실행시켜서 예상하지 못한 숫자가 나온다.

실행시킨 스레드가 종료되기 전까지 기다리는 함수 pthread_join를 사용한다면 정상적으로 덧셈을 다한 후 답이 나올 것이다.

근데 큰 오류가 있다. 컴파일한 후 계속 코드를 실행시켜보자.

이상한 값들이 출력된다.

-> 하나의 자원을 한 번에 하나의 스레드만 사용하도록 해야 하는데 그렇지 못한 상황