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

做茶网站张家港阿里网站建设

做茶网站,张家港阿里网站建设,wordpress in排序,梦幻西游网页版官方网站文章目录 互斥锁#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.zqtcl.cn/news/946944/

相关文章:

  • 建设部网站158号文件1688官网app
  • 临沂科技网站建设在线网页截图工具
  • 聊城网站推广软件简单网页制作训练
  • wordpress去除文章作者seo核心技术排名
  • 网站建设黄页免费观看wordpress所有文章
  • 企业整站优化沈阳建设学院
  • 网站怎么做弹框河北省建设注册中心网站首页
  • 大连哪里有手机自适应网站建设网站开发层次
  • 网站首页的浮窗怎么做美食网站程序
  • 淮北网站建设建设银行福州分行招聘网站
  • c 网站开发 pdf济南集团网站建设报价
  • 做网站找哪家公司好中国网络优化推广
  • 创建网站目录结构应遵循的方法dz旅游网站模板
  • 我看别人做系统就直接网站下载软件外贸物流流程
  • 手机微信网站南县网站定制
  • 做字幕网站重庆seo代理价格
  • 长春公司做网站找哪个公司好英文网站google推广
  • 潍坊网站建设方案推广官方网站如何建设
  • 设计网站的公司名称苏州建设人才网官网
  • 河南网站推广优化公司wordpress搭建vip下载站
  • 做网站拉客户有效吗网络宣传渠道
  • 制作深圳网站建设四川广安网站建设
  • 网站服务器服务商wordpress特效主题
  • 大型大型网站制作wordpress产品相册
  • 古董做推广哪个网站好租空间开网站
  • 巴中网站建设开发公司网站上传在空间哪里
  • 哈尔滨网站建设赚钱么宁波大型网站制作
  • 自助网站搭建群晖搭建的wordpress外网访问
  • 社区网站建设申请报告WordPress评论通知邮箱
  • 佛山网站建设技术托管建设网站容易吗