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

在下面的 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

                }

            }

        }

    }

}


一只斗牛犬
浏览 173回答 1
1回答

森栏

我认为您提供的输入文件需要花费很多时间才能被程序读取(通过每行 scanf)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go