'''
Dinning Philosopher Symmetric
Moss Rookie
ไม่ควรใช้โปรแกรมนี้ในการอ้างอิงในทางวิชาการใดๆ ทั้งสิ้น
เป็นโปรแกรมที่เขียนขึ้นมาเอง ไม่มีการทำความสะอาด source code ทั้งสิ้น
ทำเพื่อเป็นตัวอย่างในการเขียน Thread ใน python แบบง่ายๆ rookie ๆ
และเำพื่อให้เข้าใจปัญหา Dinning Philosopher ในวิชา OS(ที่เขียนมานี้เป็นในแบบที่ผมเข้าใจ)
โปรแกรมนี้ทำงานโดยจะมีการสร้าง Tread ขึ้นมาตามจำนวนของ Philosopher
และมีจำนวนของ chopstick เท่ากับจำนวนของ Philosopher
chopstick เป็นตัวแปลกลางที่ทุก Tread สามารถเข้าถึงได้
โดยมีกฏว่า
1 เมื่อ Philosopher มี chopstick 2 อันเท่านั้นถึงจะมีโอกาสได้กินอาหาร
2 Philosopher จะสามารถหยิบ chopstick ได้แค่ที่วางอยู่ข้างตัวเองเท่านั้น
3 มีโอกาสกินอาหารได้แค่ 1 ครั้งเท่านั้นต่อการได้ chopstick ครบคู่(ห้ามถือครอง)
4 ไม่มีใครมีสิทธิ์มากกว่ากัน คือห้ามหยิบ chopstick ที่คนอื่นถือครองอยู่
5 ทุกคนต้องมีโอกาสได้กินอาหาร หรือไม่มีใครรอไปตลอดกาล
การทำงานของโปรแกรม
1 รันด้วย python dinning.py
2 เลือกจำนวนของ Philosopher
3 ดูผลการทำงาน
4 กด Ctrl+C เพื่อให้ร้านปิดแล้วให้ Philosopher รีบกินให้เสร็จ(ให้ Tread แต่ล่ะตัวจบการทำงาน ก่อนออกจาก program)
'''
import thread
import threading
import random
import time
import signal
#Magic number
#PRINT = 1 Mean print all action
#ON_THE_TABLE = 0 Mean chopsticks is on the table
#Function handler
def handler(signum,frame):
restaurantOpen = False
while buf < 2 or buf> 10:
self.kount = 0
self.tno = tno
def isdeadlock(self,lis):
for i in range(len(lis)):
# race: "Who got first chopstick
time.sleep(random.randint(1,5))
# wait forever if can not get 2 chopstick or when deadlock occur
while 1:
if chopstick[self.tno%numberOfThread]==ON_THE_TABLE:
# Get left chopstick may cause dead-lock
chopstick[self.tno%numberOfThread]=ON_THE_TABLE
time.sleep(random.randint(1,5))
chopstick[(self.tno+1)%numberOfThread]==ON_THE_TABLE:
if action == PRINT:
print self.tno,"Pick right"
chopstick[(self.tno+1)%numberOfThread]=self.tno
time.sleep(random.randint(1,3))
if chopstick[self.tno%numberOfThread]==self.tno and chopstick[(self.tno+1)%numberOfThread]==self.tno:break
if action == PRINT:
if action == PRINT:
time.sleep(random.randint(1,2))
if action == PRINT:
time.sleep(random.randint(1,2))
kount = 0
while restaurantOpen:
self.eating()
kount +=1
self.drop()
self.think()
#define my Magic number
PRINT = 1 #Mean print all action
ON_THE_TABLE = 0 #Mean chopsticks is on the table
restaurantOpen = True
signal.signal(signal.SIGINT, handler)
action = PRINT
numberOfThread = setNumberOfThread()
chopstick = []
philosopher = []
for i in range(numberOfThread):
print chopstick
print "Start call Tread"
for i in range(1,numberOfThread+1):
for thrd in philosopher:
while restaurantOpen:
for thrd in philosopher:
ไม่มีความคิดเห็น:
แสดงความคิดเห็น