해결방안
총 5가지의 세마포어를 설계
- 철학자 밖에서 만드는 세마포어 : 2종류 (포크, print)
- 각 철학자 내에서 만드는 세마포어 : 3종류 (죽음확인, 최근 식사시간, 먹은 횟수)
세마포어는 이름이 있으므로, 이름을 붙여줘야 함.
- 이 경우 각 철학자 내에서 만드는 세마포어의 이름을 ft_strjoin(), ft_itoa()로 만들어야 함.
- 이를 해제해 주는 작업 역시 꼭 필요함. (leaks와 세마포어 자원의 낭비 방지)
-fsanitize=thread 옵션을 줄 경우 데이터 레이스가 난다고 표기.
- 분명히 데이터 레이스를 방지하기 위해 각 세마포어를 뮤택스처럼 응용. 그럼에도 이러한 결과가 나왔던 이유는 무엇일까 찾아본 결과…
- -fsanitize=thread 옵션에서는 semaphore 관련 함수를 감지할 수 없음.
- 단, 클러스터 내 아이맥으로는 이에 대한 완벽한 해결책을 찾을 수 없음.
- valgrind를 통해 정확한 것을 확인할 수 있으나, valgrind는 설치 시 sudo를 요구함.
데이터 레이스를 방지하는 방법
- 포크를 직접 만질 수 없음. (세마포어가 자원의 소유를 의미하는 것이 아니기 때문)
- 따라서 왼손, 오른손을 드는 전략으로 가는 것은 무의미.
- 프로세스는 쓰레드와 달리 만드는데 시간이 상당히 걸리기 때문에, 먼저 만들어진 철학자에게 먹을 수 있는 권한을 우선적으로 부여한다면 알아서 상호배제가 가능하다고 판단.
199명 철학자는 무한히 살아남지 못함.
- 현재의 방식에서는 170명까지만 무한히 살아남았음.
- 뭔가 더 좋은 방법이 있다면 좋겠지만, 컨텍스트 스위칭의 시간을 배재할 방법이 있을까?