协程并发资源型竞争问题

本文通过一个示例介绍了Go语言中协程并发时可能出现的资源型竞争问题,以及如何通过使用互斥锁`sync.Mutex`来解决这个问题。在计算阶乘并存入全局map的过程中,由于未加锁导致并发写入map时出现错误。通过在写入前加锁并在写入后解锁,确保了并发安全。文章强调了虽然10秒内理论上所有协程应执行完毕,但在实际运行中仍可能存在资源争夺,因此使用互斥锁是必要的。
摘要由CSDN通过智能技术生成

package main

import (
“sync”
“time”
“fmt”
)

/*
不同goroutine之间如何通讯
1)全局变量加锁同步
2)channel
使用全局变量加锁同步改进程序
因为没有对全局变量m加锁,因此会出现资源争夺问题,代码会出现错误,提示concurrent map writes
解决方案,加入互斥锁
我们的数的阶乘很大,结果会越界,可以将求阶改成sum+=unint64(i)
sync包提供了基本的同步基元,如互斥锁,除了once和waitGroup乐星,大部分都是适用于低水平程序县城,高水平的同步使用channel通信更好一些。
本包的类型的值不应被拷贝

/
var(
myMap = make(map[int]int,10)
//声明一个全局的互斥量
//lock 是一个全局的互斥量
//sync是包:synchornized同步
//Mutex:是互斥
lock sync.Mutex
)
//test函数就是计算n!,让将这个结果放入到myMap
func test(n int){
res:=1
for i:=1;i<=n;i++{
res
=i
}
//这里将res放入到myMap
//加锁(在执行前不管怎么样先加锁)
lock.Lock()//(写+锁)
myMap[n]=res//concurrent map wri

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值