握月担风
  • 标签🏷️
主页 » 🧩 标签

Golang

Golang互斥锁-Mutex

互斥锁结构 // A Mutex is a mutual exclusion lock. // The zero value for a Mutex is an unlocked mutex. // // A Mutex must not be copied after first use. type Mutex struct { state int32 sema uint32 } state表示当前互斥锁的状态, sema是用于控制锁状态的信号量 在默认情况下,互斥锁的所有状态位都是 0,int32 中的不同位分别表示了不同的状态: mutexLocked — 表示互斥锁的锁定状态; mutexWoken — 唤醒模式,此时释放锁的g不会唤醒休眠的g; mutexStarving — 当前的互斥锁进入饥饿状态; waitersCount — 当前互斥锁上等待的 Goroutine 个数; 正常模式和饥饿模式的区别: 在正常模式下,锁的等待者会按照先进先出的顺序获取锁。但是刚被唤起的 Goroutine 与新创建的 Goroutine 竞争时,大概率会获取不到锁,为了减少这种情况的出现,一旦 Goroutine 超过 1ms 没有获取到锁,它就会将当前互斥锁切换饥饿模式,防止部分 Goroutine 被『饿死』。 ...

2022-12-27 · 壹次心

golang-map介绍

本文中使用的 go 版本: go version go1.17.2 darwin/amd64 内容概述 本文介绍 golang 中经常用到的结构-map,简称哈希表、字典。介绍其结构及设计思路。 map 在源码中的结构——hmap Go 语言采用的核心数据结构是哈希查找表,使用链表解决哈希冲突。 在源码中$GOROOT/src/runtime/map.go,map 的核心结构体是这样的: // A header for a Go map. type hmap struct { count int // map中的元素数量,即len(map)时的返回值 flags uint8 B uint8 // buckets的以2为底的对数, 即2^B=buckets noverflow uint16 // 溢出桶的近似数; see incrnoverflow for details hash0 uint32 // 哈希种子 buckets unsafe.Pointer // 2^B个bucket的数组,may be nil if count==0. oldbuckets unsafe.Pointer // 哈希在扩容时用于保存之前 buckets 的字段,它的大小是当前 buckets 的一半; nevacuate uintptr // progress counter for evacuation (buckets less than this have been evacuated) extra *mapextra // optional fields } 在上面我们需要关注的核心是buckets,它是一个指针,最终指向了bmap结构体数组 ...

2022-01-05 · 壹次心
« 上一页 
© 2025 握月担风 Powered by Hugo & PaperMod