✨컴공주✨ [1052682] · MS 2021 (수정됨) · 쪽지

2023-12-25 12:54:07
조회수 975

컴공 일기238

게시글 주소: https://orbi.kr/00066131728


Multi 라는 얘기가 나오는 순간 동기화에 대한 이슈들은 필연적으로 따라오게 됩니다. Multi-Threading / Multi-Processor / Multi-Processing /...


그 동기화를 해주는 도구들 중 하나가 Mutex라는 녀석이죠. 상호 배제를 의미하는 (Mutual-Exclusive)의 약어이구요.


코드가 복잡하긴 합니다만,


스레드가 여러개라 할 지라도, Mutex Lock과 Unlock 사이에 놓인 임계구역엔 Lock이 반환되기 전까지 단 하나의 스레드만 접근할 수 있습니다. 즉 경쟁 조건이 차단되었다는 의미이고, 나름의 실행순서가 정해지게 된다는 의미이지요.


물론 락을 어떤 스레드가 먼저 획득하게 되는지 프로그래머는 알 수 없습니다. 그것은 온전히 스케줄러의 몫이죠. 그래서, 멀티라는 얘기가 컴공에서 나오는 순간, 그놈의 ‘우연성’ 얘기가 따라 나오게 되죠.


복잡하네요… 설명해놓고도.

공부를 아직 더 해야 하나봅니다.





void test(int i)

{

  //If i'm hungry and my neighbors are not eating,

  //then let me eat.


  if(state[i] == HUNGRY &&

     state[leftOf(i)] != EATING && state[rightOf(i)] != EATING)

  {

     state[i] = EATING;

     pthread_cond_signal(&cond_vars[i]);

  }

}


void pickup(int i)

{

  pthread_mutex_lock(&mutex_lock);


  state[i] = HUNGRY;

  test(i);


  while(state[i] != EATING)

  {

     pthread_cond_wait(&cond_vars[i], &mutex_lock);

  }


  pthread_mutex_unlock(&mutex_lock);


}


void putdown(int i)

{

   pthread_mutex_lock(&mutex_lock);


   state[i] = THINKING;

   test(leftOf(i));

   test(rightOf(i));


   pthread_mutex_unlock(&mutex_lock);

}

0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.