什么是种族条件?...
种族条件是一种条件,一个以上的goroutine同时访问相同的数据。原因是数据被混乱了,这是并发编程中的常见情况。
如何解决它?....
golang提供了一个称为sync.mutex
的软件包,当发生竞赛条件时,只有一个goroutine才能访问数据,而穆特斯(Mutex)所有goroutines都可以访问数据,如何工作? Mutex可以使用锁定和解锁函数
让我们代码
A.估价种族条件
1.具有函数的启动变量以增加值
type counter struct {
number int
}
func (value *counter) Add(param int) {
value.number += param
}
2.使用Goroutines和sync.WaitGroup
运行计数器功能
import (
"fmt"
"sync"
)
func main() {
var counter counter
wg := new(sync.WaitGroup)
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
for i := 0; i < 100; i++ {
counter.Add(1)
}
wg.Done()
}()
}
wg.Wait()
fmt.Println(counter.number)
}
完整代码
package main
import (
"fmt"
"sync"
)
type counter struct {
number int
}
func (value *counter) Add(param int) {
value.number += param
}
func main() {
var counter counter
wg := new(sync.WaitGroup)
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
for i := 0; i < 100; i++ {
counter.Add(1)
}
wg.Done()
}()
}
wg.Wait()
fmt.Println(counter.number)
}
使用此命令运行代码
go run -race main.go
add -race 标志是在我们的goroutine中检测种族条件,结果是:
检测到种族条件我们如何解决此问题 .....?
让我们解决
在这种情况下,使用sync.mutex
软件包是最好的解决方案,因为我们可以在任务开始时锁定数据并在完成任务时解锁数据。
B.解决种族条件
1. ADD SYNC.MUTEX在计数器结构中
type counter struct {
number int
sync.Mutex
}
2.锁定数据
func (value *counter) Add(param int) {
value.Lock()
value.number += param
value.Unlock()
}
3.运行代码
将无法检测到比赛条件,我们的问题解决了
go run -race main.go
结果是100000
结论
sync.Mutex
是线程安全类型的,使用此软件包使我们的goroutines更安全,远离种族条件
不要惊慌和保持安全,谢谢