通过通信共享内存

在传统的线程模型中程序在线程之间通信需要使用共享内存。通常,共享数据结构有锁来保护,线程将争用锁来访问数据。在某些情况下,通过使用线程安全的数据,这样会变得更容易。

Go的并发原语goroutines和channels为构造并发软件提供了一种优雅独特的方法。Go没有显式的使用锁来协调对共享数据的访问,而是鼓励使用chan在goroutine之间传递数据的引用。这种方法确保在给定的时间只有一个goroutine可以访问数据。

数据竞争

data race(数据竞争)是两个或多个goroutine访问同一个资源,并尝试对该资源进行读写而不考虑其他goroutine。

go1.1中引入了race detector。竞争检测器在构建过程中内置到程序中的代码。然后,一旦你的程序运行,它就能够检测并报告它发现的任何竞争条件。

命令如下所示:

go build -race or go test -race

数据竞争例子,代码如下:

package main

import (
    "fmt"
    "sync"
    "time"
)

var (
    wg sync.WaitGroup
    Counter int = 0
)

func main() {
     for routine := 1; routine <= 2; routine++ {
        wg.Add(1)
        go Routine(routine)
    }
    wg.Wait()
    fmt.Println("Current Counter : ", Counter)
}

func Routine(id int) {
    for count := 0; count < 2; count++ {
        value := Counter
        // time.Sleep(1 * time.Nanosecond)
        value++
        Counter = value
    }
    wg.Done()
}
sync.atomic

that's all

results matching ""

    No results matching ""