phil.st
来自「四皇后问题」· ST 代码 · 共 75 行
ST
75 行
Class Main
[
main
( DiningPhilosophers new: 5 ) dine: 4
]
Class DiningPhilosophers
| diners forks philosophers |
[
new: aNumber
diners <- aNumber.
forks <- Array new: aNumber.
philosophers <- Array new: aNumber.
(1 to: diners) do:
[ :p | forks at: p put: (Semaphore new: 1).
philosophers at: p put: (Philosopher new: p)]
|
dine: time
(1 to: diners) do:
[ :p | (philosophers at: p)
leftFork: (forks at: p)
rightFork: (forks at: ((p \\ diners) + 1))].
time timesRepeat:
[(1 to: diners) do: [ :p | (philosophers at: p) philosophize]].
(1 to: diners) do:
[ :p | (philosophers at: p) sleep]
]
Class Philosopher
| leftFork rightFork myName myPhilosophy |
[
new: name
myName <- name.
myPhilosophy <- [[true] whileTrue:
[self think.
self getForks.
self eat.
self releaseForks.
selfProcess suspend]
] newProcess
|
leftFork: lfork rightFork: rfork
leftFork <- lfork.
rightFork <- rfork
|
getForks
((myName \\ 2) == 0)
ifTrue: [leftFork wait. rightFork wait]
ifFalse: [rightFork wait. leftFork wait]
|
releaseForks
leftFork signal.
rightFork signal
|
think
('Philosopher ',(myName asString),' is thinking.') print.
10 timesRepeat: [selfProcess yield]
|
eat
('Philosopher ',(myName asString),' is eating.') print.
10 timesRepeat: [selfProcess yield]
|
philosophize
myPhilosophy resume
|
sleep
myPhilosophy terminate.
('Philosopher ',(myName asString),' is sleeping.') print.
myPhilosophy <- nil
]
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?