상당히 조심히 다뤄야 한다. 쓰레드는 만들어지는 시간이 짧기 때문에 병렬성을 조심해야 한다.
쓰레드는 자원을 소유할 수 있다.
- 무슨 자원인지를 생각해 보는 게 좋다. 과연 쓰레드 자체가 자원이 될 수 있을까?
- 물론 쓰레드에는 원자성이라는 것이 존재해서, 0과 1로 계산을 할 수 있기는 하다.
- 다만, 본인의 경우 그래도 쓰레드가 무슨 자원을 의미하는 것인지를 표기해주는 배열을 만들기는 했다.
- 이 배열을 어떠한 조건을 표기하는데 직접적으로 사용하지는 않았으며, 단지 쓰레드가 무슨 자원을 소유하는 것인지를 보여주는 지표라고 볼 수 있을 것이다.
철학자 절반 쉬게 하기
-
절반만 젓가락을 집게 하는 방식이라고 생각하면 된다.
-
이 경우 표로 생각을 해보면..
./philosopher 5 610 200 200
철학자 먹는 시간 2번, 4번 200초 5번, 3번 200초 1번 200초 철학자가 홀수면 먹는 시간의 3배를 사는 시간으로 줘야 계속 살아남을 수 있다.
./philosopher 4 410 200 200
철학자 먹는 시간 2번, 4번 200초 5번, 1번 200초 철학자가 짝수면 먹는 시간의 2배를 사는 시간으로 줘야 계속 살아남을 수 있다.
모니터링 쓰레드
-
while()문을 돌면서 이것저것 확인하는 작업이 필요함.
- 먹은 횟수를 다 채웠는지 확인하는 작업
- 사는 시간을 초과했는지 확인하는 작업
-
각 작업에 걸리는 시간을 조절하기 위해 usleep()을 걸어주는 것도 필요함.
-
모니터링 쓰레드가 죽음을 알리면 포크를 내려놓고 뮤택스를 풀어주는 과정을
철학자 안에 녹이는 작업이 꼭 필요함.
-
이걸 잘 맞추는 것이 쓰레드를 잘 다루는 방법이라고 할 수 있음.