• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go并发

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1.go可以使用并发开启多个协程案例如下

package main
import (
	"fmt"
	"runtime"
	"sync"
)
func main() {
	runtime.GOMAXPROCS(2)
	var wg sync.WaitGroup 
	wg.Add(2) //开启2个协程
	fmt.Println("start gorouteings")

	go func(){
		defer wg.Done()
		for count:=0; count <3;count++ {
			for char:='a'; char < 'a'+26; char++ {
				fmt.Printf("%c",char)
			}
			fmt.Println()
		}
	}()
	go func(){
		defer wg.Done()
		for count:=0; count <3;count++ {
			for char:='A'; char < 'A'+26; char++ {
				fmt.Printf("%c",char)
			}
			fmt.Println()
		}
	}()
	fmt.Println("end gorouteing")
	wg.Wait() //为了防止协程没有执行完成,主协程关闭提前退出问题所以需要等待
}

备注:问题可以开启多个协程但是对资源这块有竞争关系案例如下

案例2

package main
import (
	"fmt"
	"runtime"
	"sync"
)
var (
	count int
	wg sync.WaitGroup
)
func inCount(id int){
	defer  wg.Done()
	runtime.Gosched()
	for i:=0;i < 2; i++ {
		value:= i
		value++
		count= value
	}
}
func main(){
	 wg.Add(2)
	 go inCount(1)
	 go inCount(2)
	 wg.Wait()
	 fmt.Println(count)
}

备注:这个案例count为2说明有竞争关系因为协程在争夺资源所以为结果数值为2 解决办法加锁 案例3如下

package main
import (
	"fmt"
	"sync"
	"sync/atomic"
)
var (
	Count int64
	wg sync.WaitGroup
)
func AddCount(){
	wg.Done()
	for i:=0;i<2;i++{
		value := i
		value++
		atomic.AddInt64(&Count,1)
	}
}
func main(){
	wg.Add(2)
	go AddCount()
	go AddCount()
	wg.Wait()
	fmt.Println(Count)
}

 

备注:使用atomic包里面的方法因为是原子操作所以可以解决问题。这是第一种方法,还有第二种办法使用锁包 mutnx 给协程加锁代码如下

package main
import (
	"fmt"
	"sync"
)
var (
	Count int
	wg sync.WaitGroup
	mutnx sync.Mutex
)

func intTotal(){
	defer  wg.Done()
	mutnx.Lock()
	for i:=0;i <2;i++ {
		value:= Count
		value++
		Count = value
	}
	mutnx.Unlock()
}
func main(){
	wg.Add(2)
	go intTotal()
	go intTotal()
	wg.Wait()
	fmt.Println(Count)
}

  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
028Go语言标准库之context发布时间:2022-07-10
下一篇:
go语言之进阶篇无缓冲channel发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap