亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何檢測占用鎖的goroutine?

如何檢測占用鎖的goroutine?

Go
慕田峪4524236 2023-07-31 14:59:09
我制作了一個 HTTP 服務器,并Echo存儲數據使用storm和數據模型,如下所示:項目1(桶)?device_type_1(桶)??設備_1(kv)??設備_2(kv)?device_type_2(桶)??設備_1(kv)??設備_2(kv)項目2(桶)?...除了更新數據庫之外,收到HTTP請求后還有一些其他事情要做,所以我使用這樣的事務:tx, err := db.Begin(true)if err != nil {  return}defer tx.Rollback()// for simplicityprojectBkt := tx.From("project1")projectBkt.Save(&project)// other things.......if err := tx.Commit(); err != nil {  return}提交 Bolt 事務時很有可能出現鎖等待,堆棧如下所示:goroutine 53 [semacquire, 5 minutes]:sync.runtime_SemacquireMutex(0xc000002560, 0x16a7f00, 0x0)        C:/Go/src/runtime/sema.go:71 +0x4esync.(*RWMutex).Lock(0xc000002558)        C:/Go/src/sync/rwmutex.go:103 +0xc0go.etcd.io/bbolt.(*DB).mmap(0xc0000023c0, 0x20000, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/[email protected]/db.go:246 +0x65go.etcd.io/bbolt.(*DB).allocate(0xc0000023c0, 0x1, 0x0, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/[email protected]/db.go:846 +0x24bgo.etcd.io/bbolt.(*Tx).allocate(0xc000e98fc0, 0x1, 0x0, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/[email protected]/tx.go:454 +0x79go.etcd.io/bbolt.(*node).spill(0xc0001539d0, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/[email protected]/node.go:368 +0x3f0go.etcd.io/bbolt.(*Bucket).spill(0xc0001cb740, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/[email protected]/bucket.go:541 +0x73ago.etcd.io/bbolt.(*Bucket).spill(0xc000e98fd8, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/[email protected]/bucket.go:508 +0x64fgo.etcd.io/bbolt.(*Tx).Commit(0xc000e98fc0, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/[email protected]/tx.go:163 +0x1bfgithub.com/asdine/storm.(*node).Commit(0xc0001cb380, 0x0, 0x0)        D:/data/Go/pkg/mod/github.com/asdine/[email protected]+incompatible/transaction.go:46 +0x5c.....問題是如何檢測占用鎖的 goroutine 以便檢查整個操作順序?
查看完整描述

1 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

Goroutines 沒有外部 ID。

根據設計,可以在一個 Goroutine 中獲取鎖,并在另一個 Goroutine 中釋放鎖。因此,如果鎖被持有,它并不是Goroutine 持有:任何人都可以解鎖它,并且沒有 ID 來記錄誰鎖定了它。

(因此,答案是,僅使用提供的互斥體,您無法看到誰占用了它。)


查看完整回答
反對 回復 2023-07-31
  • 1 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號