You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询Go中Sync.Mutex等待互斥锁的线程数量?

Go中获取Mutex等待协程数的方案

标准库sync.Mutex和sync.RWMutex没有提供直接获取等待协程数量的公开API——这类内部状态属于Go runtime的实现细节,标准库不会暴露以避免用户依赖不稳定的底层逻辑。

可行替代方案

1. 自定义封装带计数的锁

你可以基于标准Mutex封装一个带等待计数的实现,通过原子操作维护等待数:

import (
    "sync"
    "sync/atomic"
)

type CountedMutex struct {
    mu        sync.Mutex
    waitCount int64
}

func (cm *CountedMutex) Lock() {
    atomic.AddInt64(&cm.waitCount, 1)
    cm.mu.Lock()
    atomic.AddInt64(&cm.waitCount, -1)
}

func (cm *CountedMutex) Unlock() {
    cm.mu.Unlock()
}

func (cm *CountedMutex) WaitCount() int64 {
    return atomic.LoadInt64(&cm.waitCount)
}

注意:该实现会带来微小性能开销,且WaitCount()返回的是瞬间近似值(计数与加锁操作之间可能有其他协程插队),但足以满足监控或调试场景需求。

2. 用Go runtime工具调试分析

如果仅用于调试,可以借助Go自带工具:

  • pprof:通过go tool pprof查看锁竞争情况,能定位到存在等待的锁,并查看等待协程的栈信息,但不会直接返回精确等待数。
  • trace:生成执行轨迹文件后,用go tool trace分析,可直观看到协程在锁上的等待时长、数量等细节。

内容的提问来源于stack exchange,提问作者Kumar Pratyush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:39:27