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

编辑网站教程网络推广技术培训

编辑网站教程,网络推广技术培训,做个营销型网站要多少钱,备案期间网站能打开吗文章目录 互斥锁#xff1a; sync.Mutexsync.WaitGroup 计数器例子func (*WaitGroup) Addfunc (*WaitGroup) Donefunc (*WaitGroup) Wait 读写互斥锁参考资料 临界区总是需要通过同步机制进行保护的#xff0c;否则就会产生竞态条件#xff0c;导致数据不一致。 互斥锁… 文章目录 互斥锁 sync.Mutexsync.WaitGroup 计数器例子func (*WaitGroup) Addfunc (*WaitGroup) Donefunc (*WaitGroup) Wait 读写互斥锁参考资料 临界区总是需要通过同步机制进行保护的否则就会产生竞态条件导致数据不一致。 互斥锁 sync.Mutex 一个互斥锁可以被用来保护一个临界区我们可以通过它来保证在同一时刻只有一个 goroutine 处于该临界区之内同一个时刻只有一个线程能够拿到锁 先通过一个并发读写的例子演示一下当多线程同时访问全局变量时结果会怎样 package mainimport (fmt )var count intfunc main() {for i : 0; i 2; i {go func() {for i : 1000000; i 0; i-- {count}fmt.Println(count)}()}fmt.Scanf(\n) //等待子线程全部结束 }//运行结果 //1003065 //1033207修改代码在累加的地方添加互斥锁就能保证我们每次得到的结果都是想要的值 package mainimport (fmtsync )var (count intlock sync.Mutex )func main() {for i : 0; i 2; i {go func() {for i : 1000000; i 0; i-- {lock.Lock()countlock.Unlock()}fmt.Println(count)}()}fmt.Scanf(\n) //等待子线程全部结束 }// 运行结果 //1991307 //2000000每当有 goroutine 想进入临界区时都需要先对它进行锁定并且每个 goroutine 离开临界区时都要及时地对它进行解锁锁定和解锁操作分别通过互斥锁 sync.Mutex 的 Lock 和 Unlock 方法实现。使用互斥锁的时候有以下注意事项 不要重复锁定互斥锁不要忘记解锁互斥锁必要时使用 defer 语句不要对尚未锁定或者已解锁的互斥锁解锁不要在多个函数之间直接传递互斥锁。 sync.WaitGroup 计数器 type WaitGroup struct {// contains filtered or unexported fields// 包含已筛选或未导出的字段 }A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished. At the same time, Wait can be used to block until all goroutines have finished. WaitGroup等待goroutines的集合完成。主goroutine调用Add来设置要等待的goroutine的数量。然后每个goroutine都会运行并在完成时调用Done。同时可以使用Wait来阻止直到所有goroutine都完成。 A WaitGroup must not be copied after first use. 首次使用后不得复制WaitGroup。 In the terminology of the Go memory model, a call to Done “synchronizes before” the return of any Wait call that it unblocks. 在Go内存模型的术语中对Done的调用在其取消阻止的任何Wait调用返回之前“同步”。 例子 This example fetches several URLs concurrently, using a WaitGroup to block until all the fetches are complete. 此示例同时获取多个URL使用WaitGroup进行阻止直到所有获取完成。 package mainimport (sync )type httpPkg struct{}func (httpPkg) Get(url string) {}var http httpPkgfunc main() {var wg sync.WaitGroupvar urls []string{http://www.csdn.net/,http://www.youku.com/,http://www.baidu.com/,}for _, url : range urls {// Increment the WaitGroup counter.// 增加WaitGroup计数器。wg.Add(1)// Launch a goroutine to fetch the URL.// 启动goroutine以获取URL。go func(url string) {// Decrement the counter when the goroutine completes.// goroutine完成时递减计数器。defer wg.Done()// Fetch the URL.// 获取URL。http.Get(url)}(url)}// Wait for all HTTP fetches to complete.// 等待所有HTTP获取完成。wg.Wait() }func (*WaitGroup) Add func (wg *WaitGroup) Add(delta int)Add adds delta, which may be negative, to the WaitGroup counter. If the counter becomes zero, all goroutines blocked on Wait are released. If the counter goes negative, Add panics. Add向WaitGroup计数器添加可能为负数的delta。如果计数器变为零则会释放在Wait上阻止的所有goroutines。如果计数器为负数Add会恐慌。 Note that calls with a positive delta that occur when the counter is zero must happen before a Wait. Calls with a negative delta, or calls with a positive delta that start when the counter is greater than zero, may happen at any time. 请注意计数器为零时发生的具有正增量的调用必须在等待之前发生。任何时候都可能发生具有负增量的调用或当计数器大于零时开始的具有正增量的调用。 Typically this means the calls to Add should execute before the statement creating the goroutine or other event to be waited for. If a WaitGroup is reused to wait for several independent sets of events, new Add calls must happen after all previous Wait calls have returned. See the WaitGroup example. 通常这意味着对Add的调用应该在创建goroutine或其他待等待事件的语句之前执行。如果重用一个WaitGroup来等待多个独立的事件集则必须在所有以前的wait调用都返回后进行新的Add调用。请参阅WaitGroup示例。 func (*WaitGroup) Done func (wg *WaitGroup) Done()Done decrements the WaitGroup counter by one. Done将WaitGroup计数器递减一。 func (*WaitGroup) Wait func (wg *WaitGroup) Wait()Wait blocks until the WaitGroup counter is zero. 等待块直到WaitGroup计数器为零。 读写互斥锁 互斥锁是完全互斥的但是有很多实际的场景下是读多写少的当我们并发的去读取一个资源不涉及资源修改的时候是没有必要加锁的这种场景下使用读写锁是更好的一种选择。读写锁在Go语言中使用sync包中的RWMutex类型。 读写锁分为两种读锁和写锁。当一个goroutine获取读锁之后其他的goroutine如果是获取读锁会继续获得锁如果是获取写锁就会等待当一个goroutine获取写锁之后其他的goroutine无论是获取读锁还是写锁都会等待。 读写锁示例 package mainimport (fmtsynctime )var (x int64wg sync.WaitGrouplock sync.Mutexrwlock sync.RWMutex )func write() {// lock.Lock() // 加互斥锁rwlock.Lock() // 加写锁x x 1time.Sleep(10 * time.Millisecond) // 假设读操作耗时10毫秒rwlock.Unlock() // 解写锁// lock.Unlock() // 解互斥锁wg.Done() }func read() {// lock.Lock() // 加互斥锁rwlock.RLock() // 加读锁time.Sleep(time.Millisecond) // 假设读操作耗时1毫秒rwlock.RUnlock() // 解读锁// lock.Unlock() // 解互斥锁wg.Done() }func main() {start : time.Now()for i : 0; i 10; i {wg.Add(1)go write()}for i : 0; i 1000; i {wg.Add(1)go read()}wg.Wait()end : time.Now()fmt.Println(end.Sub(start)) }// 173.3553ms参考资料 sync包 golang并发之sync包
http://www.yutouwan.com/news/29379/

相关文章:

  • 网站建设第一品牌 网站设计如何做好seo基础优化
  • 用jsp做网站的难点百度指数查询官网入口登录
  • 福州招聘网站有哪几个哈尔滨建设发展集团
  • 中冶东北建设最新网站濮阳建设公司网站
  • 游戏评测网站怎么做哪些网站才能具备完整的八项网络营销功能
  • 一个做音乐的网站2020做seo还有出路吗
  • 网站建设海报设计长沙地区网络优化设计方案
  • 皖icp合肥网站建设岳阳卖房网站
  • 甘肃省城乡建设局网站首页安阳县陈佳
  • 郑州有做彩票网站的吗网页美化与布局教程
  • 河北住房与城乡建设部网站专业网站开发开发
  • 网站做app服务端北京传媒公司排名
  • 织梦做泰文网站域名没到期 网站打不开
  • 最新仿5173游戏装备交易网站 游戏币交易平台源码整合支付接口搜索引擎营销题库和答案
  • 做商城网站的项目背景图片深圳网站建设网站优化服务
  • 做网站需求 后期方便优化营销培训课程ppt
  • 注册网站地址互联网网站制作公司
  • 母婴网站建设的与功能模块提供网站建设框架
  • excel服务器做网站百度做的网站
  • 如何优化m网站国际公司名称大全名头
  • 建设体育课程基地网站百度权重网站排名
  • 人才网站的会计账如何做在线观看免费网站网址
  • 写作文网站什么网站可以做试题
  • 番禺建设网站报价做外贸兼职的网站
  • 成都络迈品牌网站建设网站软件设计
  • 知乎 php网站开发书籍抖音小店代运营
  • 网站做接口怎么做吉利的广告公司名字
  • 排名好的郑州网站建设WordPress网址导航主题HAOWA
  • 网站建设代码优化奉化商用关键词优化
  • 外贸网建站网站 源码 php