go-routine的golang内存引用规则

时间:2017-02-02 02:17:13

标签: go concurrency channels

希望通过频繁使用go-routine来使一些代码尽可能多核友好。然而,我是golang的新手,并且遗漏了一些看似基本的东西。

作为示例,我想生成一个go-routine,创建并保持打开一个rcc通信通道到altcoin钱包。跳过一堆无关紧要的东西,代码看起来像:

package wallet
var client btcprcclient.Client
func Server(c chan int) {
    client, err := bitrpcclient.New()  
    defer client.Shutdown() 
    c <- 1 // signal main routine client is establish
    <- c   // wait for the main routine to signal us to shutdown
}

func Status() {
    blockCount, err := client.GetBlockCount()
}

package main
func main() {
    c := make(chan int)
    go wallet.Server(c)
    <- c // wait for the wallet to be ready
    wallet.Status()
    c <-1 // terminate the wallet connection
} 

如果我将Status()函数中的代码附加到Server()函数中,它可以正常工作。但是,由于伪写,当Status()引用global-to-wallet客户端变量时,我得到一个无效的内存地址混乱。

我在猜测&#34;对&#34;这样做的方法是重写服务器以对通道输入进行操作,调用本地status()函数(和/或我想用钱包做的任何其他事情),但我的想法很困惑为什么当前的方式不会。工作。即使main()&amp; Status()在核心0上运行,而Server在核心1上运行,该盒子仍然有一个共同的内存模型,所以var客户端的地址应该是相同的???

0 个答案:

没有答案