为了账号安全,请及时绑定邮箱和手机立即绑定

即使使用 GOMAXPROCS(4),GoLang 程序也能在单线程上执行

即使使用 GOMAXPROCS(4),GoLang 程序也能在单线程上执行

Go
一只斗牛犬 2021-11-22 19:37:21
在下面的 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 回答

?
森栏

TA贡献1810条经验 获得超5个赞

我认为您提供的输入文件需要花费很多时间才能被程序读取(通过每行 scanf)。


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信