keepeye

第 1986 号会员 /

回复了 keepeye 创建的主题: for死循环和多线程问题

package main

import (
    "fmt"
    "runtime"
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    go foo()
    go foo()
    go foo()
    go foo()
    for {
    }
}

func foo() {
    fmt.Println("fooo")
    for {
    }
}

测试了一下这样的代码,发现输出了3行"fooo",而第四行却没有。 可以认为:
在单线程时,其他goroutine任务只能等当前goroutine主动挂起(比如chan阻塞)才会切换。多线程时,在go foo()的时候就直接把这个goroutine放到其他线程中了,不受当前线程死循环影响。

回复了 keepeye 创建的主题: for死循环和多线程问题

我的粗浅理解: 单核心线程情况下,for循环无法挂起并切换到别的goroutine。多核心的情况下却可以?

回复了 ybu2008 创建的主题: 怎么样把接口的值打出来。

实现Stringer接口,代码如下:

package main
import "fmt"
type Integer int
func (a Integer)Less(b Integer) bool{
    return a < b
}
func (a *Integer)Add(b Integer){
    *a += b
}

func (a *Integer)String() string {
    return fmt.Sprintf("%d",*a);   
}

type LessAddr interface{
    Less(b Integer) bool
    Add(b Integer)
}
func main(){
    var a Integer = 1
    var b LessAddr = &a
    b.Add(2)
    fmt.Printf("%v",b)  //打印的是b的内存地址,我想达到fmt.Println(a)的效果,该如何做。thanks
}