열렬히.뛰기

완성품

école 42 > philosopher > philosopher : 보너스 > 완성품

해결방안

총 5가지의 세마포어를 설계

  • 철학자 밖에서 만드는 세마포어 : 2종류 (포크, print)
  • 각 철학자 내에서 만드는 세마포어 : 3종류 (죽음확인, 최근 식사시간, 먹은 횟수)

세마포어는 이름이 있으므로, 이름을 붙여줘야 함.

  • 이 경우 각 철학자 내에서 만드는 세마포어의 이름을 ft_strjoin(), ft_itoa()로 만들어야 함.
  • 이를 해제해 주는 작업 역시 꼭 필요함. (leaks와 세마포어 자원의 낭비 방지)

-fsanitize=thread 옵션을 줄 경우 데이터 레이스가 난다고 표기.

  • 분명히 데이터 레이스를 방지하기 위해 각 세마포어를 뮤택스처럼 응용. 그럼에도 이러한 결과가 나왔던 이유는 무엇일까 찾아본 결과…
  • -fsanitize=thread 옵션에서는 semaphore 관련 함수를 감지할 수 없음.
  • 단, 클러스터 내 아이맥으로는 이에 대한 완벽한 해결책을 찾을 수 없음.
  • valgrind를 통해 정확한 것을 확인할 수 있으나, valgrind는 설치 시 sudo를 요구함.

데이터 레이스를 방지하는 방법

  • 포크를 직접 만질 수 없음. (세마포어가 자원의 소유를 의미하는 것이 아니기 때문)
  • 따라서 왼손, 오른손을 드는 전략으로 가는 것은 무의미.
  • 프로세스는 쓰레드와 달리 만드는데 시간이 상당히 걸리기 때문에, 먼저 만들어진 철학자에게 먹을 수 있는 권한을 우선적으로 부여한다면 알아서 상호배제가 가능하다고 판단.

199명 철학자는 무한히 살아남지 못함.

  • 현재의 방식에서는 170명까지만 무한히 살아남았음.
  • 뭔가 더 좋은 방법이 있다면 좋겠지만, 컨텍스트 스위칭의 시간을 배재할 방법이 있을까?