Golang 贪婪线程占用临界区过多问题

Posted jackey2015

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 工作量的两倍!

程序输出如下,


 
技术图片
 

以上是关于Golang 贪婪线程占用临界区过多问题的主要内容,如果未能解决你的问题,请参考以下文章

使用Windbg分析多线程临界区死锁问题分享

使用Windbg分析多线程临界区死锁问题分享

线程同步(windows平台):临界区

java 多线程怎么深入?

同步互斥的实现

高并发基础