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

    程序输出如下,


     
     
  • 相关阅读:
    Poj(1459),最大流,EK算法
    Poj(3259),SPFA,判负环
    HDU(3790),最短路二级标准
    Poj(2349),最小生成树的变形
    CSUFT2016训练赛
    NYOJ(21),BFS,三个水杯
    Poj(3687),拓扑排序,
    Poj(2367),拓扑排序
    HDU(1856),裸的带权并查集
    HDU(1572),最短路,DFS
  • 原文地址:https://www.cnblogs.com/jackey2015/p/11824953.html
Copyright © 2011-2022 走看看