有什么网站可以接设计做百度高级搜索首页
sync包提供了基本的同步原语,例如互斥锁、条件变量和等待组。对于所有这些类型,有一个硬性规则要遵循:它们永远不应该被复制。让我们来理解下这个原理和可能发生的问题。
我们将创建一个线程安全的数据结构来存储计数器。它将包含一个map[string]int,表示每个计数器的当前值。我们还将用sync.Mutex,因为必须保护访问。我们添加一个Increment方法来增加给定的计数器名称:
type Counter struct {mu sync.Mutexcounters map[string]int
}func NewCounter() Counter {return Counter{counters: map[string]int{}}
}func (c Counter) Increment(name string) {c.mu.Lock()defer c.mu.Unlock()c.counters[name]++
}
增量逻辑在临界区完成:在c.mu.Lock( )和c.mu.Unlock()之间。尝试一下我们的方法,使用-race选项运行以下示例,该示例启动两个 goroutine 并增加它们各自的计数器:
counter := NewCounter()go func() {counter.Increment("foo")
}()
go func() {counter.Increment("bar")
}()
运行这个程序,它会引发数据竞争:
====