39 lines
543 B
Go
39 lines
543 B
Go
package q1226
|
|
|
|
import "sync"
|
|
|
|
var (
|
|
pick = sync.Mutex{}
|
|
forks = [5]sync.Mutex{}
|
|
)
|
|
|
|
type DiningPhilosophers struct {
|
|
}
|
|
|
|
func (p *DiningPhilosophers) wantsToEat(
|
|
philosopher int,
|
|
pickLeftFork func(),
|
|
pickRightFork func(),
|
|
eat func(),
|
|
putLeftFork func(),
|
|
putRightFork func(),
|
|
) {
|
|
l, r := &forks[philosopher], &forks[(philosopher+1)%5]
|
|
|
|
pick.Lock()
|
|
l.Lock()
|
|
r.Lock()
|
|
pick.Unlock()
|
|
|
|
pickLeftFork()
|
|
pickRightFork()
|
|
eat()
|
|
|
|
putLeftFork()
|
|
l.Unlock()
|
|
putRightFork()
|
|
r.Unlock()
|
|
}
|
|
|
|
var _t = DiningPhilosophers{}
|
|
var _ = _t.wantsToEat
|