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 工作量的两倍!

    程序输出如下,


     
     
  • 相关阅读:
    flashdevelop生成swc库(转)
    SOG and COG spec
    [C]switch...case...一个case包含多个值的一种写法
    [C]赋值语句返回值
    Antenna知识整理
    SPI接口比IIC速度快的理解
    C语言代码的换行
    SRRC认证
    蓝牙协议分析(6)_BLE地址类型
    结构体变量和指针对成员的引用形式
  • 原文地址:https://www.cnblogs.com/jackey2015/p/11824953.html
Copyright © 2011-2022 走看看