在下面的 GoLang 程序中,我尝试使用 2*N 个 goroutines(每个男人和女人 1 个)来实现N 个男人和 N 个女人的稳定婚姻问题。该程序严格遵循程序定义,因为每个 goroutine(读作“每个男人”)通过通道向所需的女人 goroutine 发送消息,而女人 goroutine 又拒绝/接受他的提议。我希望该程序可以轻松地在设置runtime.GOMAXPROCS(4)时在多个线程上进行调度,但是它仍然(几乎)在完全相同的时间运行(并且运行 linux 命令time仍然显示 CPU 使用率100%而不是预期400%)package mainimport ( "fmt" "runtime" "time")const N = 500type 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 } } } }}
- 1 回答
- 0 关注
- 172 浏览
添加回答
举报
0/150
提交
取消