• [Go] golang的竞争状态


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


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


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

    package main
    
    import (
    	"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
    	}
    }
    

      

  • 相关阅读:
    云服务器数据库连接(初始密码)
    springboot打jar包正常无法访问页面
    JAVA项目启动正常,无法访问
    vs快捷键大全(转)
    Effective C#(3)
    单元测试之道C#版(1)
    单元测试之道C#版(2)
    从零开始复习股票知识
    A new languageGo
    单元测试之道C#版(3)
  • 原文地址:https://www.cnblogs.com/taoshihan/p/10349970.html
Copyright © 2020-2023  润新知