Theo những gì được viết trong EWD 310 "Thứ tự phân cấp các quy trình tuần tự" , có vẻ như số 5 đã được chọn cho mục đích giáo dục, để giúp học sinh hiểu thuật toán được thiết kế để giải thích vấn đề dễ dàng hơn.
Chính bài viết này hỗ trợ thêm cho ý tưởng rằng 5 không thực sự liên quan đến vấn đề chung, trước tiên bằng cách tuyên bố rõ ràng rằng "vấn đề có thể đã được đặt ra cho 9 hoặc 25 triết gia ..." và tiếp theo, bằng cách trình bày nó theo hai khía cạnh hoạt động đồng thời các thực thể, "lớp A và lớp B, chia sẻ cùng một tài nguyên ..."
Giải pháp được Dijkstra sử dụng giới thiệu ba "trạng thái của triết gia": suy nghĩ, ăn uống, đói khát. Mã được trình bày để giải quyết vấn đề, vận hành ba trạng thái này, cùng với số lượng các nhà triết học không liên quan .
Tác giả đã chọn số lượng triết gia 2, 3 hoặc 4, điều này có thể gây nhầm lẫn cho các sinh viên đọc mã, cho dù số được chọn có liên quan đến số lượng trạng thái hay cái gì khác. Điều này có thể dễ dàng được kiểm tra bằng cách cố gắng số nêu trong mô tả trích dẫn từ EWD310 dưới đây: lưu ý ví dụ như thế nào điều này sẽ thay đổi [0:4]
để [0:3]
, [0:2]
, [0:1]
và các báo cáo liên quan đến mod
.
Trái ngược với điều này, số 5 trông khá ngây thơ và không viện dẫn các hiệp hội không cần thiết. Người ta có thể nói rằng nó đã được chọn để minh họa rõ hơn rằng số lượng các nhà triết học là, tốt, tùy ý .
Thuật toán được đề cập được trình bày trong EWD 310 như sau:
... chúng tôi liên kết với mỗi triết gia một biến trạng thái, "C" nói, trong đó
C[i] = 0
có nghĩa là: triết gia i
đang suy nghĩ
C[i] = 2
có nghĩa là: triết gia i
đang ăn.
...
chúng tôi giới thiệu cho lần chuyển đổi cuối cùng một trạng thái trung gian
C[i] = 1
có nghĩa là: triết gia i
đang đói
Bây giờ mỗi triết gia sẽ đi theo chu kỳ thông qua các trạng thái 0, 1, 2, 0 ...... Câu hỏi tiếp theo cần đặt ra là: khi nào sự chuyển đổi (nguy hiểm) từ 1 sang 2 diễn ra đối với triết gia K
?
...
Trong vũ trụ, chúng ta giả sử tuyên bố
1) semaphore mutex
, ban đầu = 1
2) integer array C[0:4]
, với ban đầu tất cả phần tử = 0
3) semaphore array prisem[0:4]
với ban đầu tất cả các yếu tố = 0
4) procedure test (integer value K);
if C[(K-1) mod 5] ≠ 2 and C[K]= 1
and C[(K+1) mod 5] ≠ 2 do
begin C[K]:= 2; V(prisem[K]) end;
(Quy trình này, giải quyết sự không ổn định K
khi có mặt, sẽ chỉ được gọi từ trong một phần quan trọng).
Trong vũ trụ này, cuộc sống của triết gia w
bây giờ có thể được mã hóa
cycle begin think;
P (mutex);
C[w]:= 1; test (w);
V(mutex);
P(prisem[w]); eat
P(mutex);
C[w]:= 0; test [(w+l) mod 5];
test [(w-1) mod 5];
V(mutex)
end
Và điều này kết luận giải pháp tôi đang nhắm đến ...