日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

哲学家就餐问题php代码,Python实现哲学家就餐问题实例代码

發(fā)布時間:2024/7/19 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 哲学家就餐问题php代码,Python实现哲学家就餐问题实例代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

哲學家就餐問題:

哲學家就餐問題是典型的同步問題,該問題描述的是五個哲學家共用一張圓桌,分別坐在五張椅子上,在圓桌上有五個盤子和五個叉子(如下圖),他們的生活方式是交替的進行思考和進餐,思考時不能用餐,用餐時不能思考。平時,一個哲學家進行思考,饑餓時便試圖用餐,只有在他同時拿到他的盤子左右兩邊的兩個叉子時才能進餐。進餐完畢后,他會放下叉子繼續(xù)思考。請寫出代碼來解決如上的哲學家就餐問題,要求代碼返回“當每個哲學家分別需要進食 n 次”時這五位哲學家具體的行為記錄。

測試用例:

輸入:n = 1 (1<=n<=60,n 表示每個哲學家需要進餐的次數(shù)。)

預期輸出:

[[4,2,1],[4,1,1],[0,1,1],[2,2,1],[2,1,1],[2,0,3],[2,1,2],[2,2,2],[4,0,3],[4,1,2],[0,2,1],[4,2,2],[3,2,1],[3,1,1],[0,0,3],[0,1,2],[0,2,2],[1,2,1],[1,1,1],[3,0,3],[3,1,2],[3,2,2],[1,0,3],[1,1,2],[1,2,2]]

思路:

輸出列表中的每一個子列表描述了某個哲學家的具體行為,它的格式如下:

output[i] = [a, b, c] (3 個整數(shù))

a 哲學家編號。

b 指定叉子:{1 : 左邊, 2 : 右邊}.

c 指定行為:{1 : 拿起, 2 : 放下, 3 : 吃面}。

如 [4,2,1] 表示 4 號哲學家拿起了右邊的叉子。所有自列表組合起來,就完整描述了“當每個哲學家分別需要進食 n 次”時這五位哲學家具體的行為記錄。

代碼實現(xiàn)

import queue

import threading

import time

import random

class CountDownLatch:

def __init__(self, count):

self.count = count

self.condition = threading.Condition()

def wait(self):

try:

self.condition.acquire()

while self.count > 0:

self.condition.wait()

finally:

self.condition.release()

def count_down(self):

try:

self.condition.acquire()

self.count -= 1

self.condition.notifyAll()

finally:

self.condition.release()

class DiningPhilosophers(threading.Thread):

def __init__(self, philosopher_number, left_fork, right_fork, operate_queue, count_latch):

super().__init__()

self.philosopher_number = philosopher_number

self.left_fork = left_fork

self.right_fork = right_fork

self.operate_queue = operate_queue

self.count_latch = count_latch

def eat(self):

time.sleep(0.01)

self.operate_queue.put([self.philosopher_number, 0, 3])

def think(self):

time.sleep(random.random())

def pick_left_fork(self):

self.operate_queue.put([self.philosopher_number, 1, 1])

def pick_right_fork(self):

self.operate_queue.put([self.philosopher_number, 2, 1])

def put_left_fork(self):

self.left_fork.release()

self.operate_queue.put([self.philosopher_number, 1, 2])

def put_right_fork(self):

self.right_fork.release()

self.operate_queue.put([self.philosopher_number, 2, 2])

def run(self):

while True:

left = self.left_fork.acquire(blocking=False)

right = self.right_fork.acquire(blocking=False)

if left and right:

self.pick_left_fork()

self.pick_right_fork()

self.eat()

self.put_left_fork()

self.put_right_fork()

break

elif left and not right:

self.left_fork.release()

elif right and not left:

self.right_fork.release()

else:

time.sleep(0.01)

print(str(self.philosopher_number) + ' count_down')

self.count_latch.count_down()

if __name__ == '__main__':

operate_queue = queue.Queue()

fork1 = threading.Lock()

fork2 = threading.Lock()

fork3 = threading.Lock()

fork4 = threading.Lock()

fork5 = threading.Lock()

n = 1

latch = CountDownLatch(5 * n)

for _ in range(n):

philosopher0 = DiningPhilosophers(0, fork5, fork1, operate_queue, latch)

philosopher0.start()

philosopher1 = DiningPhilosophers(1, fork1, fork2, operate_queue, latch)

philosopher1.start()

philosopher2 = DiningPhilosophers(2, fork2, fork3, operate_queue, latch)

philosopher2.start()

philosopher3 = DiningPhilosophers(3, fork3, fork4, operate_queue, latch)

philosopher3.start()

philosopher4 = DiningPhilosophers(4, fork4, fork5, operate_queue, latch)

philosopher4.start()

latch.wait()

queue_list = []

for i in range(5 * 5 * n):

queue_list.append(operate_queue.get())

print(queue_list)

總結(jié)

到此這篇關(guān)于Python實現(xiàn)哲學家就餐問題的文章就介紹到這了,更多相關(guān)Python哲學家就餐內(nèi)容請搜索python博客以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持python博客!

總結(jié)

以上是生活随笔為你收集整理的哲学家就餐问题php代码,Python实现哲学家就餐问题实例代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。