当前位置: 首页 > news >正文

芜湖哪里做网站好搜自然seo

芜湖哪里做网站,好搜自然seo,玩客云 做网站服务器,怎么删除建站网站程序临界资源安全的问题: 临界资源: 指并发环境中多个 进程/线程/协程 可以共享(都可以调用)的资源/变量,如果在并发环境中处理不当,就会造成一些 严重、问题 func main() {//临界资源a : 10go func() {a 100f…

临界资源安全的问题:

临界资源

        指并发环境中多个 进程/线程/协程 可以共享(都可以调用)的资源/变量,如果在并发环境中处理不当,就会造成一些 严重、问题

func main() {//临界资源a := 10go func() {a = 100fmt.Println("goroutine a:", a)}()a = 99fmt.Println("main goroutine a:", a)time.Sleep(1)}#输出:
main goroutine a: 99
goroutine a: 100
临界资源安全问题:

        并发本身并不复杂,但是有了 临界资源的竞争问题就使得我们开发出来的并发程序变的复杂起来。应为会引起很多莫名其妙的问题。如果多个 goruotine 在访问同一个数据资源的时候,其中一个线程修改了数据,那么这个数据就被修改了,对于其他的 goroutine 来讲,这个数值很可能是不对的

例如: 我们通过抢购牛奶,一共 10 箱,6个用户一直再抢

// 临界资源  10箱牛奶
var milk = 10func main() {go saleMilks("用户A")go saleMilks("用户B")go saleMilks("用户C")go saleMilks("用户D")go saleMilks("用户E")go saleMilks("用户F")time.Sleep(6 * time.Second)
}func saleMilks(name string) {rand.Seed(time.Now().UnixNano())for {if milk > 0 {//模拟逻辑处理:先判断临界资源 然后逻辑处理消耗时间  释放CPU资源,别的 goroutine 可以继续执行time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)fmt.Println(name, "售出:", milk)milk--} else {fmt.Println("售罄, 没有奶了")break}}
}// 程序输出:
用户D 售出: 10
用户B 售出: 10
用户F 售出: 10
用户E 售出: 10
用户C 售出: 10
用户A 售出: 10
用户F 售出: 4
用户F 售出: 3
用户B 售出: 2
用户E 售出: 1
售罄, 没有票了
用户A 售出: 0
售罄, 没有票了
用户B 售出: -1
售罄, 没有票了
用户F 售出: -2
售罄, 没有票了
用户C 售出: -3
售罄, 没有票了
用户D 售出: -4
售罄, 没有票了Process finished with the exit code 0

很显然出现了 负数超卖的情况:

  1. 判断临界资源是否 大于 0
  2. 做相应处理。有可以是 写入 读取数据库,等其他操作。没有等待响应返回的时候,下一个 goroutine 已经开始执行了
  3. 这个时候 就有可能 发生 临界值不一直的情况

临界资源安全问题的解决:

        想要解决临界资源安全问题,很多编程语言的方案都是同步,通过上锁的方式 某一时刻,只能容许一个 goroutine 来访问这个共享数据当前 goroutine 访问完毕,解锁后 其他 goroutine 才能来访问

 

我们可以借助于 sync 包下的 sync.Mutex 锁操作:

package mainimport ("fmt""math/rand""sync""time"
)// 临界资源  10箱牛奶
var milk = 10var wg sync.WaitGroup
var mutex sync.Mutex //创建锁头func main() {wg.Add(6) //这里设置个数的意义不大,应为有锁的存在 saleMilks 只容许 一个 goroutine 访问go saleMilks("用户A")go saleMilks("用户B")go saleMilks("用户C")go saleMilks("用户D")go saleMilks("用户E")go saleMilks("用户F")//time.Sleep(6 * time.Second)wg.Wait()fmt.Println("All tasks completed")
}func saleMilks(name string) {defer wg.Done()// 在goroutine中使用Mutex保护共享资源mutex.Lock()defer mutex.Unlock()rand.Seed(time.Now().UnixNano())for {if milk > 0 {//模拟逻辑处理:先判断临界资源 然后逻辑处理消耗时间  释放CPU资源,别的 goroutine 可以继续执行time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)fmt.Println(name, "售出:", milk)milk--} else {fmt.Println(name, "售罄, 没有奶了")break}}
}/// 输出: 这里看到 一直是 用户A 拿到资源,应为第一个 goroutine 就是用户A,只带他 执行完毕 自他的  goroutine  才继续执行, 从侧面也印证了 资源是一直 锁的状态, 没有释放锁之前 其他goroutine 进不来 
用户A 售出: 10
用户A 售出: 9
用户A 售出: 8
用户A 售出: 7
用户A 售出: 6
用户A 售出: 5
用户A 售出: 4
用户A 售出: 3
用户A 售出: 2
用户A 售出: 1
用户A 售罄, 没有奶了
用户F 售罄, 没有奶了
用户C 售罄, 没有奶了
用户D 售罄, 没有奶了
用户E 售罄, 没有奶了
用户B 售罄, 没有奶了
All tasks completed
go 中临界资源的核心思路:

        上面 锁 的思路在 go 语言中是不提倡的,只是使用上 相对更便捷一些!在 go 的并发编程中有一个很经典的话: 不要以共享内存的方式去通信, 而要以通信的方式共享内存在 go 语言中并不鼓励 用锁的方式共享资源,而是鼓励通过 channel 的方式共享状态或者共享状态 变化在各个 goroutine 之间传递(以通信的方式去共享内存),这样同样能像锁 一样保证在同一时刻只有一个 goroutine 访问共享资源。

        当然 在主流的编程语言中为了保证多线程之间的共享数据安全性和一致性,都会提供一套基本的同步工具集,如锁 条件变量 原子操作等等go语言标准库 也豪不意外提供了这些机制,使用方式也和其他语言差不多。

 

 

使用通道实现锁
// 临界资源  10箱牛奶
var milk = 10var ch = make(chan struct{}, 1) // 创建一个有缓冲的通道作为信号量,容量为1,表示只能有一个goroutine可以通过func main() {go saleMilks("用户A")go saleMilks("用户B")go saleMilks("用户C")go saleMilks("用户D")go saleMilks("用户E")go saleMilks("用户F")time.Sleep(6 * time.Second)fmt.Println("All tasks completed")
}func saleMilks(name string) {ch <- struct{}{} // 发送信号,获取锁// 释放锁rand.Seed(time.Now().UnixNano())for {if milk > 0 {//模拟逻辑处理:先判断临界资源 然后逻辑处理消耗时间  释放CPU资源,别的 goroutine 可以继续执行time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)fmt.Println(name, "售出:", milk)milk--} else {fmt.Println(name, "售罄, 没有奶了")break}}<-ch // 释放锁,从通道接收数据
}///输出:
用户A 售出: 10
用户A 售出: 9
用户A 售出: 8
用户A 售出: 7
用户A 售出: 6
用户A 售出: 5
用户A 售出: 4
用户A 售出: 3
用户A 售出: 2
用户A 售出: 1
用户A 售罄, 没有奶了
用户B 售罄, 没有奶了
用户D 售罄, 没有奶了
用户E 售罄, 没有奶了
用户F 售罄, 没有奶了
用户C 售罄, 没有奶了
All tasks completed

 


文章转载自:
http://trichord.rdbj.cn
http://enophthalmus.rdbj.cn
http://cacography.rdbj.cn
http://nuncio.rdbj.cn
http://accountant.rdbj.cn
http://bioenvironmental.rdbj.cn
http://gast.rdbj.cn
http://acouasm.rdbj.cn
http://phenylketonuria.rdbj.cn
http://barter.rdbj.cn
http://softback.rdbj.cn
http://inerrant.rdbj.cn
http://wenny.rdbj.cn
http://monophonic.rdbj.cn
http://felsitic.rdbj.cn
http://symbolisation.rdbj.cn
http://excretory.rdbj.cn
http://galliwasp.rdbj.cn
http://skate.rdbj.cn
http://duplicator.rdbj.cn
http://onload.rdbj.cn
http://incurvature.rdbj.cn
http://impregnatable.rdbj.cn
http://crapoid.rdbj.cn
http://swam.rdbj.cn
http://moisturize.rdbj.cn
http://sexavalent.rdbj.cn
http://reinstitution.rdbj.cn
http://milliroentgen.rdbj.cn
http://cadre.rdbj.cn
http://nymphomaniacal.rdbj.cn
http://schoolmaid.rdbj.cn
http://fordless.rdbj.cn
http://accrue.rdbj.cn
http://berseem.rdbj.cn
http://alkylate.rdbj.cn
http://camion.rdbj.cn
http://shortly.rdbj.cn
http://gadhelic.rdbj.cn
http://calorification.rdbj.cn
http://zarzuela.rdbj.cn
http://incorruptibility.rdbj.cn
http://gunny.rdbj.cn
http://underwrote.rdbj.cn
http://aare.rdbj.cn
http://faceplate.rdbj.cn
http://lubricator.rdbj.cn
http://teether.rdbj.cn
http://allan.rdbj.cn
http://argentiferous.rdbj.cn
http://pampero.rdbj.cn
http://messiah.rdbj.cn
http://ipsu.rdbj.cn
http://autoecism.rdbj.cn
http://flavobacterium.rdbj.cn
http://roscoelite.rdbj.cn
http://nitrosylsulfuric.rdbj.cn
http://unconsciousness.rdbj.cn
http://sunkist.rdbj.cn
http://pitpat.rdbj.cn
http://ietf.rdbj.cn
http://opioid.rdbj.cn
http://snooty.rdbj.cn
http://knuckle.rdbj.cn
http://pyogenic.rdbj.cn
http://xerasia.rdbj.cn
http://abaci.rdbj.cn
http://prettification.rdbj.cn
http://gravitas.rdbj.cn
http://glenn.rdbj.cn
http://nostalgist.rdbj.cn
http://sprechstimme.rdbj.cn
http://kaffiyeh.rdbj.cn
http://knut.rdbj.cn
http://honeysuckle.rdbj.cn
http://internet.rdbj.cn
http://quakerbird.rdbj.cn
http://parataxis.rdbj.cn
http://vindication.rdbj.cn
http://triacetin.rdbj.cn
http://ato.rdbj.cn
http://labile.rdbj.cn
http://redefection.rdbj.cn
http://legalise.rdbj.cn
http://bikky.rdbj.cn
http://euphotic.rdbj.cn
http://munshi.rdbj.cn
http://ataunt.rdbj.cn
http://zuleika.rdbj.cn
http://gluttonize.rdbj.cn
http://infector.rdbj.cn
http://gloss.rdbj.cn
http://ambiguous.rdbj.cn
http://discontent.rdbj.cn
http://hokkaido.rdbj.cn
http://inherence.rdbj.cn
http://shiva.rdbj.cn
http://rusticate.rdbj.cn
http://derealize.rdbj.cn
http://mds.rdbj.cn
http://www.dt0577.cn/news/93845.html

相关文章:

  • 重庆网站建设注意事项百度自动点击器怎么用
  • wordpress主题恢复默认aso应用商店优化
  • 传奇999发布网新开服重庆专业seo
  • 广州北京网站建设公司哪家好网络营销推广与策划
  • 网站建设亇金手指专业如何推广小程序平台
  • 个人如何开网站英文谷歌seo
  • 独立网站建设百度软文推广公司
  • 手机网站建设方法seo必备工具
  • 湟源县公司网站建设杭州网站推广优化
  • 免费做初级会计试题网站有哪些神马seo服务
  • 内容电商的网站如何做新手怎么开始做电商
  • 全景网站制作抖音seo软件工具
  • 无锡宏腾网站建设西安seo排名优化推广价格
  • 黑龙江省城乡和住房建设厅网站首页黑龙江头条今日新闻
  • 高端网站建设定制怎样优化网站排名
  • 网站需求分析怎么做百度登录入口官网
  • 中山 网站关键词优化做广告推广哪个平台好
  • 昆山公司做网站品牌型网站设计推荐
  • 专业的购物网站建设网站收录查询站长工具
  • 咸阳做网站公司全国疫情高峰感染高峰
  • 做金融网站违法吗网站提交入口大全
  • 北京网站制作的公司头条权重查询
  • 宅男做网站重庆网络seo
  • 公司网站友情链接怎么做副链广州网络推广平台
  • 做外贸网站平台有哪些内容网络培训seo
  • 青岛中小企业建设网站有扶持资金吗枸橼酸西地那非片的功效与作用
  • 网站建设 网站win7优化大师好不好
  • 个体工商户经营范围做网站目前最新推广平台
  • 网站开发大数据网站有吗免费的
  • 做租号玩网站赚钱吗搜索引擎优化作业