首页 > golang 并发问题

golang 并发问题

import (
    "fmt"
    "runtime"
)

/*

结果:

    有时99
    有时100
*/

var counter_num int

const MAXSIZE = 100

func Count_num(ch chan int) {
    counter_num++
    ch <- 1
}

func main() {


    runtime.GOMAXPROCS(runtime.NumCPU()) 


    var chs [MAXSIZE] chan int


    for i := 0; i < MAXSIZE; i++ {
        chs[i] = make(chan int)
        go Count_num(chs[i])
    }

    for _, ch := range chs {
        <-ch
    }

    fmt.Println(counter_num)
}

这是我写的多个goroutine访问共享变量的代码,好像无法解决多goroutine同时访问共享变量的问题,网上也看到一个加锁的例子,但是好像听说go不需要加锁也可以解决这个问题.
牛人帮我看看。。。


package main

    import (
        "fmt"
        "runtime"
        "sync/atomic"
    )

    /*

    结果:

    有时99
    有时100
    */

    var counter_num uint32 = 0

    const MAXSIZE = 100

    func Count_num(ch chan uint32) {
        atomic.AddUint32(&counter_num, 1)
        ch <- counter_num
    }

    func main() {

        runtime.GOMAXPROCS(runtime.NumCPU())

        var chs [MAXSIZE]chan uint32

        for i := 0; i < MAXSIZE; i++ {
            chs[i] = make(chan uint32)
            go Count_num(chs[i])
        }

        for i, ch := range chs {
            print("-----", i, "\n")
            print(<-ch, "\n")
        }

        fmt.Println(counter_num)
    }

channel读写都是阻塞的,读的时候会一个个读,写也会一个个写。

play.golang http://play.golang.org/p/3OEXRguREM

package main

import "fmt"

func Count(ch chan int) {
    ch <- 1
}
func main() {
    chs := make([]chan int, 100)
    for i := 0; i < 100; i++ {
        chs[i] = make(chan int)
        go Count(chs[i])
    }
    var sum int = 0
    for _, ch := range chs {
        sum += <-ch
    }

    fmt.Println(sum)
}
【热门文章】
【热门文章】