ตามที่เขียนไว้ใน EWD310 "ลำดับขั้นตอนของกระบวนการลำดับ"ดูเหมือนว่าหมายเลข 5 ได้รับการคัดเลือกเพื่อวัตถุประสงค์ทางการศึกษาเพื่อให้นักเรียนเข้าใจขั้นตอนวิธีที่ออกแบบมาเพื่อแสดงวิธีการแก้ปัญหาได้ง่ายขึ้น
บทความนี้ยังสนับสนุนแนวคิดที่ว่า 5 ไม่เกี่ยวข้องกับปัญหาทั่วไปอย่างแรกโดยระบุอย่างชัดเจนว่า"ปัญหานี้อาจเกิดขึ้นสำหรับนักปรัชญา 9 หรือ 25 คน ... "และต่อไปโดยแสดงเป็นสองการดำเนินงานพร้อมกัน เอนทิตี"คลาส A และคลาส B แบ่งปันทรัพยากรเดียวกัน ... "
วิธีการแก้ปัญหาที่ Dijkstra นำเสนอ "สภาวะของนักปรัชญา" สามประการ: ความคิดการกินการหิว รหัสที่นำเสนอเพื่อแก้ไขปัญหาดำเนินการทั้งสามรัฐพร้อมกับจำนวนที่ไม่เกี่ยวข้องกับมันของนักปรัชญา
ผู้แต่งจะเลือกจำนวนนักปรัชญา 2, 3 หรือ 4 ซึ่งอาจทำให้เกิดความสับสนของนักเรียนที่อ่านรหัสไม่ว่าตัวเลขที่เลือกจะเกี่ยวข้องกับปริมาณของรัฐหรืออย่างอื่น นี้สามารถทดสอบโดยพยายามตัวเลขที่กล่าวถึงในรายละเอียดที่ยกมาจาก EWD310 ด้านล่าง: หมายเหตุตัวอย่างเช่นวิธีนี้จะเปลี่ยน[0:4]
ไป[0:3]
, [0:2]
, และงบที่เกี่ยวข้องกับ[0:1]
mod
ตรงข้ามกับสิ่งนี้หมายเลข 5 ดูไร้เดียงสาและไม่เรียกสมาคมที่ไม่ต้องการ หนึ่งสามารถพูดได้ว่ามันได้รับเลือกให้ดีขึ้นแสดงให้เห็นถึงจำนวนของนักปรัชญาที่เป็นอย่างดีโดยพลการ
อัลกอริทึมที่กล่าวถึงมีการนำเสนอใน EWD310 ดังนี้:
... เราเชื่อมโยงตัวแปรสถานะกับนักปรัชญาแต่ละคน "C" พูดที่ใด
C[i] = 0
หมายถึง: นักปรัชญาi
กำลังคิด
C[i] = 2
หมายถึง: นักปรัชญาi
กำลังกิน
...
เราแนะนำสำหรับการเปลี่ยนผ่านครั้งสุดท้ายของรัฐระดับกลาง
C[i] = 1
หมายถึง: นักปรัชญาi
หิว
ตอนนี้ปราชญ์แต่ละคนจะวนเวียนอยู่ในรัฐ 0, 1, 2, 0 ...... คำถามต่อไปที่ถามคือ: เมื่อใดที่การเปลี่ยนแปลง (อันตราย) จาก 1 เป็น 2 จะเกิดขึ้นสำหรับนักปรัชญาK
?
...
ในจักรวาลที่เราคิดว่าประกาศ
1) the semaphore mutex
, เริ่มต้น = 1
2) the integer array C[0:4]
, โดยเริ่มต้นองค์ประกอบทั้งหมด = 0
3) the semaphore array prisem[0:4]
with all elements = 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;
(ขั้นตอนนี้ซึ่งแก้ไขความไม่เสถียรสำหรับK
เมื่อมีอยู่จะถูกเรียกจากภายในส่วนที่สำคัญเท่านั้น)
ในจักรวาลนี้ชีวิตของนักปรัชญาw
สามารถถูกเข้ารหัสได้แล้ว
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
และนี่เป็นการสรุปวิธีแก้ปัญหาที่ฉันมุ่งที่ ...