在下面的 GoLang 程序中,我尝试使用 2*N 个 goroutines(每个男人和女人 1 个)来实现N 个男人和 N 个女人的稳定婚姻问题。
该程序严格遵循程序定义,因为每个 goroutine(读作“每个男人”)通过通道向所需的女人 goroutine 发送消息,而女人 goroutine 又拒绝/接受他的提议。我希望该程序可以轻松地在设置runtime.GOMAXPROCS(4)时在多个线程上进行调度,但是它仍然(几乎)在完全相同的时间运行(并且运行 linux 命令time仍然显示 CPU 使用率100%而不是预期400%)
package main
import (
"fmt"
"runtime"
"time"
)
const N = 500
type human struct {
pref [N]int
phone chan int
cur_eng int
cur_num int
id int
}
var men = [N]human{}
var women = [N]human{}
func man(id int) {
guy := &men[id]
for {
runtime.Gosched()
for j := guy.cur_num + 1; j < N; j++ {
guy.cur_num = j
girl := &women[guy.pref[guy.cur_num]]
girl.phone <- guy.id
msg := <-guy.phone
if msg == 1 {
guy.cur_eng = guy.pref[guy.cur_num]
break
}
}
select {
case <-guy.phone:
guy.cur_eng = -1
}
}
}
func woman(id int, termi chan bool) {
girl := &women[id]
for {
runtime.Gosched()
select {
case msg := <-girl.phone:
if msg >= 0 {
if girl.cur_eng == -1 {
men[msg].phone <- 1
girl.cur_eng = msg
termi <- true
} else if girl.pref[girl.cur_eng] < girl.pref[msg] {
men[msg].phone <- 0
} else {
men[msg].phone <- 1
men[girl.cur_eng].phone <- -10
girl.cur_eng = msg
}
}
}
}
}
森栏
相关分类