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

社区网站建设公司wordpress建站程序

社区网站建设公司,wordpress建站程序,万网博通,医药外贸是做什么的临界资源安全的问题#xff1a; 临界资源#xff1a; 指并发环境中多个 进程/线程/协程 可以共享#xff08;都可以调用#xff09;的资源/变量#xff0c;如果在并发环境中处理不当#xff0c;就会造成一些 严重、问题 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 很显然出现了 负数超卖的情况 判断临界资源是否 大于 0做相应处理。有可以是 写入 读取数据库等其他操作。没有等待响应返回的时候下一个 goroutine 已经开始执行了这个时候 就有可能 发生 临界值不一直的情况 临界资源安全问题的解决         想要解决临界资源安全问题很多编程语言的方案都是同步通过上锁的方式 某一时刻只能容许一个 goroutine 来访问这个共享数据当前 goroutine 访问完毕解锁后 其他 goroutine 才能来访问。   我们可以借助于 sync 包下的 sync.Mutex 锁操作 package mainimport (fmtmath/randsynctime )// 临界资源 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 completedgo 中临界资源的核心思路         上面 锁 的思路在 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://www.hkea.cn/news/14375384/

相关文章:

  • 网站开发工具与使用平台永嘉做网站
  • 济南泰安网站建设公司设计制作一个企业类型网站
  • 免费试用网站源码抑郁症图片加时间生成器在线制作
  • 凡科网站后台登陆指数运算法则
  • 泉州建设工程招投标信息网衡阳seo优化首选
  • 若比邻跨境电商网站网站建设到运营需要多少钱
  • 做零食网站的首页模板网页浏览器缩写
  • 建设网站前需考虑哪些问题贵州住房建设厅网站
  • wordpress时间插件下载地址seo建站淘客
  • 选择网站建设公司凤凰网站ui专业设计
  • .net开发微信网站4s店网站建设
  • 哪些是企业网站wordpress 输出json
  • 网站开发tornadowordpress 记账
  • 做网站子页网站项目开发流程图
  • 江西华邦网站建设广州安全教育平台咨询电话
  • phpcms 后台修改修改网站备案号seo织梦网站建设步骤
  • 建设网站的好处广州开发区建设局网站黄埔
  • 网站建设问题表网页设计哪个培训机构好
  • 网站内容设计主要包括做珠宝首饰网站
  • dw做网站的导航栏咸宁做网站哪家好
  • 网站建设收费标准行情安卓盒子做网站
  • 网站色调阿里网站备案寄材料
  • 重庆专业做淘宝网站四级作文模板万能
  • 网站建站网站299266co找公司做网站要注意什么问题
  • 百度站内搜索提升关键词排名做网站免费模板怎么上传到空间
  • 怎么建网站免费的网站建设对于学校的重要性
  • 云平台网站建设工业信息部网站备案
  • 文创产品设计网站推荐天津企业如何建网站
  • 丰台成都网站建设cps网站建设
  • 艺客网站首页当今网站开发技术的现状