연습의 설명 :
너는 튀김의 부분을 요구할 수있는 N 점이있는이 대중 음식점이있다. 각 포인트는 M 부분을가집니다. 튀김이 1 개 있습니다. 주문 지점에 2 개의 부분이 있으면 cheff에게 리필이 필요하다는 경고를 보냅니다. cheff는 FIFO 순서대로 부분을 전달합니다. wait()/signal() 블록에서 뮤텍스 획득이 어떻게됩니까?
init {
Semafoor[] mutex;
Condition[] cond_point = new Condition[N];
int[] portions = new int[N];
ArrayList<int> waitline = new ArrayList<int>();
for(int i = 0; i < N; i++) {
mutex[i] = new Semafoor(1);
portions[i] = M;
}
}
point(int n) {
while(1) {
mutex[n].acquire();
if(portions[n] == 0) {
cond_point[n].wait(mutex[n]);
}
else if(portios[n] == 2) {
waitline.add(n);
}
portions[n]--;
mutex[n].release();
}
}
frycheff() {
int n;
while(1) {
if(!waitline.empty()) {
n = waitline.remove(0);
mutex[n].acquire();
portions[n] += M;
cond_point[n].signal();
mutex[n].release();
}
}
}
그래서 우리가 때
wait()
문 블록
point(int n)
신호를 발생하는 궁금해 : 우리는이 의사 코드를했다. 다큐멘터리에서 뮤텍스를 원자 적 방식으로 공개 했으므로 간섭이 없다고 말합니다. 하지만 다른 코드 줄은 어떨까요? (
point(int n)
함수에서)?
portions[n]
등 - 회선이 삭제 되었습니까?
signal()
문은
point(int n)
기능으로 리콜되지만 리셋 방식으로 기능이 새로운 기능으로 실행됩니까? 미리 감사드립니다.
왜 부분 [n] -;이 (가) 삭제 되었습니까? 나는 당신이 기다림/신호가 점프 지시와 같은 것이라고 생각하는 느낌을 가지고있다. 그러나 그것은 사실이 아니다. – 1000ml
뮤텍스가 출시 되었기 때문에 – JasperHofman
아아, 나는 본다. - 뮤텍스가 기다리기 전에 재실행된다. – 1000ml