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

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

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来获取等待在锁上的线程数量:

  1. var (
  2. mu sync.Mutex
  3. cond = sync.NewCond(&mu)
  4. count int
  5. )
  6. func main() {
  7. // 启动多个goroutine
  8. for i := 0; i < 10; i++ {
  9. go doSomething()
  10. }
  11. // 等待一段时间,让goroutine进入等待状态
  12. time.Sleep(time.Second)
  13. // 获取等待在锁上的线程数量
  14. mu.Lock()
  15. waitingThreads := count
  16. mu.Unlock()
  17. fmt.Println("等待在锁上的线程数量:", waitingThreads)
  18. }
  19. func doSomething() {
  20. mu.Lock()
  21. count++
  22. cond.Wait()
  23. count--
  24. mu.Unlock()
  25. }

在上面的示例中,我们创建了一个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

  1. a.Lock()
  2. ...
  3. enter code here
  4. ...
  5. 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:

确定