标签: go
与该标签相关的所有文章 "go".
-
Go 并发(三):内存模型、happens-before 与同步语义
Go 内存模型定义了 happens-before 偏序关系,它是 sequenced-before(单 goroutine 内语句顺序)和 synchronized-before(跨 goroutine 同步操作)的传递闭包。只有通过 happens-before 关联的写操作才保证对读操作可见。2022 年(Go 1.19)修订正式赋予 sync/atomic 顺序一致性语义,与 C++ seq_cst、Java volatile 对齐。任何存在 data race 的 Go 程序行为未定义——不存在"良性竞争"。
-
Go 并发(二):sync 包与并发原语
sync 包的每个原语都围绕同一个核心模式:fast path 用 atomic 无锁操作,slow path 用 runtime semaphore 休眠/唤醒。Mutex 通过 normal/starvation 双模式平衡吞吐与尾延迟;sync.Map 在 Go 1.24 重写为 HashTrieMap(并发哈希字典树);sync.Pool 利用 per-P 本地存储 + victim cache 实现两轮 GC 缓冲。理解这些内部结构,才能在正确的场景选择正确的原语。
-
Go 并发(一):Channel 内部机制与使用模式
Channel 是 Go CSP 并发模型的核心原语,底层由 hchan 结构体实现(环形缓冲区 + 互斥锁 + 两条等待队列)。发送/接收的关键优化是直接传输——当对端已在等待时,数据绕过缓冲区直接拷贝到对方栈上。select 通过随机轮询序(防饥饿)+ 地址排序加锁(防死锁)实现多路复用。理解这些内部机制对写出正确、高效的并发代码至关重要。