博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Go] golang的竞争状态
阅读量:6000 次
发布时间:2019-06-20

本文共 823 字,大约阅读时间需要 2 分钟。

1.goroutine在逻辑处理器的线程上进行交换

2.竞争状态:两个或者多个goroutine在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于互相竞争的状态
对共享资源的读和写操作必须是原子化的,同一时刻只能有一个goroutine对共享资源进行读和写操作

3.使用竞争检测器编译代码,执行检查竞争状态
go build -race

 

package mainimport (	"fmt"	"runtime"	"sync")//全局共享变量var (	//要读写的变量	counter int	//wg计数	wg sync.WaitGroup)func main() {	//只使用一个逻辑处理器	runtime.GOMAXPROCS(1)	//增加两个goroutine	wg.Add(2)	go incCounter(1)	go incCounter(2)	//等待两个子goroutine结束	wg.Wait()	fmt.Println("最终Counter:", counter)}//改变counter的值func incCounter(id int) {	//减少wg计数	defer wg.Done()	for i := 0; i < 2; i++ {		//获取counter的值,两个goroutine同时启动获取到此时counter的值是0		//等切换调度后,副本的值还是之前的0		value := counter		//当前goroutine从线程退出,放回等待队列,切换到下一个goroutine,强制调度器进行切换		//以便使竞争状态的效果更明显		runtime.Gosched()		value++		//修改counter的值		counter = value	}}

  

转载于:https://www.cnblogs.com/taoshihan/p/10349970.html

你可能感兴趣的文章
Java:HashMap和Hashset的实现
查看>>
使用jmx监控tigase状态简单说明
查看>>
Windows2008R2跨林迁移用户、计算机(5)
查看>>
如何查看mysql当前的连接数,如何停止某个连接
查看>>
远程连接linux桌面之vnc
查看>>
c#winform开发启示录(创世纪新篇)
查看>>
MacBook AWS cli 安装
查看>>
使用unity3d 接入anySDK的总结1
查看>>
我的友情链接
查看>>
Hudson配置个人持续集成服务器
查看>>
lua学习笔记(基础)
查看>>
linux初始化对/etc/rc.d/init.d的理解
查看>>
ffmpeg 和 SDL 教程教程1:制作屏幕录像
查看>>
@JsonTypeInfo与@JsonSubTypes
查看>>
收货地址参数校验:收货人、邮编、地址、手机、固话等
查看>>
TP模板标签中的 foreach 和 volist 、for 的不同
查看>>
c#日期格式化 總結
查看>>
imag.js|教你如何智做原生APP
查看>>
Eclipse下 java.lang.OutOfMemoryError: PermGen space
查看>>
我的友情链接
查看>>