如何在Sync.Mutex中找到等待互斥锁的线程数量?

huangapple go评论83阅读模式
英文:

How to find the number of threads waiting for mutex lock in Sync.Mutex?

问题

在Go语言中,可以使用sync.Mutex来实现互斥锁。根据你提供的代码片段,你正在使用sync.Mutex来保护一段临界区代码。你想知道是否有API可以知道有多少线程正在等待在a.Lock()处。

在Go语言中,sync.Mutex并没有提供直接的API来获取等待在锁上的线程数量。sync.Mutex只提供了Lock()Unlock()方法来实现锁的加锁和解锁操作。

如果你需要了解等待在锁上的线程数量,你可以考虑使用sync.Cond(条件变量)来实现。sync.Cond提供了Wait()Signal()Broadcast()等方法,可以用于线程之间的等待和通知。你可以创建一个sync.Cond对象,并在调用Lock()之前调用Wait()方法,然后在调用Unlock()之后调用Signal()Broadcast()方法来通知等待的线程。

以下是一个示例代码,演示了如何使用sync.Cond来获取等待在锁上的线程数量:

var (
    mu sync.Mutex
    cond = sync.NewCond(&mu)
    count int
)

func main() {
    // 启动多个goroutine
    for i := 0; i < 10; i++ {
        go doSomething()
    }

    // 等待一段时间,让goroutine进入等待状态
    time.Sleep(time.Second)

    // 获取等待在锁上的线程数量
    mu.Lock()
    waitingThreads := count
    mu.Unlock()

    fmt.Println("等待在锁上的线程数量:", waitingThreads)
}

func doSomething() {
    mu.Lock()
    count++
    cond.Wait()
    count--
    mu.Unlock()
}

在上面的示例中,我们创建了一个sync.Cond对象cond,并将其与sync.Mutex对象mu关联。在doSomething()函数中,我们首先获取锁,并将count加1,然后调用cond.Wait()方法使当前goroutine进入等待状态。在main()函数中,我们启动了多个goroutine,并在一段时间后获取等待在锁上的线程数量。

请注意,使用sync.Cond需要谨慎处理,以避免死锁和竞争条件。确保在正确的时机调用Signal()Broadcast()方法来通知等待的线程。

英文:

I am using this in a go subroutine

    a.Lock()
    ...
    enter code here
    ...
    a.Unlock()

Is there any api to know how many threads are waiting at a.Lock()?

答案1

得分: 2

有没有API可以知道有多少线程在a.Lock()处等待?

没有。

(基本上,如果你需要知道这个,你应该重新设计你的算法。)

英文:

> Is there any api to know how many threads are waiting at a.Lock()?

No.

(And basically if you need to know that you should redesign your aglorithm.)

huangapple
  • 本文由 发表于 2022年8月5日 17:05:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/73247263.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定