zoukankan      html  css  js  c++  java
  • Golang 贪婪线程占用临界区过多问题

     

    这是一个创建于 2019-06-07 01:32:39 的文章,其中的信息可能已经有所发展或是发生改变。
    package main
    
    import (
        "fmt"
        "sync"
        "time"
    )
    
    var wg sync.WaitGroup
    var sharedLock sync.Mutex
    
    const runtime = 1 * time.Second
    
    func main() {
        wg.Add(2)
        greedyWorker := func() {
            defer wg.Done()
            var count int
            for begin := time.Now(); time.Since(begin) <= runtime; {
                sharedLock.Lock()
                time.Sleep(3 * time.Nanosecond)
                sharedLock.Unlock()
                count++
            }
            fmt.Printf("Greedy worker was able to execute %v work loops
    ", count)
        }
    
        politeWorker := func() {
            defer wg.Done()
            var count int
    
            for begin := time.Now(); time.Since(begin) <= runtime; {
                sharedLock.Lock()
                time.Sleep(1 * time.Nanosecond)
                sharedLock.Unlock()
                sharedLock.Lock()
                time.Sleep(1 * time.Nanosecond)
                sharedLock.Unlock()
                sharedLock.Lock()
                time.Sleep(1 * time.Nanosecond)
                sharedLock.Unlock()
                count++
            }
    
            fmt.Printf("Polite worker was able to execute %v work loops
    ", count)
        }
        go greedyWorker()
        go politeWorker()
        wg.Wait()
    }
    
    

    贪婪的 worker 会贪婪地抢占共享锁,以完成整个工作循环,而平和的 worker 则试图只在需要时锁定。两种 worker 都做同样多的模拟工作(sleeping 时间 为 3ns),但是你可以看到,在同样的时间里,贪婪的 worker 工作量几乎是 平和的 worker 工作量的两倍!

    程序输出如下,


     
     
  • 相关阅读:
    mysql 基础整合大全
    django 完整日志配置
    rest_framework视图基类与五个扩展类
    Nginx + uWSGI 配置django---终极版
    小程序 textarea ios兼容解决
    小程序调取数字键盘,没有小数点解决办法
    消息框-提示框
    h5页面长按保存图片
    解决浏览器自动填充input
    angularJS(2)
  • 原文地址:https://www.cnblogs.com/jackey2015/p/11824953.html
Copyright © 2011-2022 走看看