聊聊ringbuffer

ringbuffer,是环形缓存区, 或叫环形队列。

不同于一般常见的队列,环形队列收尾相连,通过移动指针来控制队列中内容的读写。

这样做有什么好处呢?

最大的好处是环形队列出队(读取)后,不需要对后续队列内容进行搬移,可以后续由入队(写入)覆盖。

下面来看下一种常见的实现方式, 通过读写指针计数来实现环形队列

计数法实现

先过一遍代码,后边会有图解版说明,方便理解

代码参考自鸟窝无限缓存channel

Read More

举例来学cond原语

最近看了鸟窝的《Go并发编程实战课》,写的挺有意思的,打算后边弄些例子再回顾下并发原语。

今天来看看cond原语。

cond 是用于等待或通知场景下的并发原语,条件不满足时,阻塞(wait)一组goroutine;条件满足后,唤醒单个(signal)或所有(broadcast)阻塞的goroutine.

比如10个运动员跑步,都准备好了,裁判才发令的例子:

Read More

Dig101-Go之深入理解mutex

Dig101: dig more, simplified more and know more

sync.MutexGo实现的互斥锁,提供了基本的同步操作,使用很方便。

不过,你是否好奇过,Go是如何实现的Mutex,又是为什么要这样实现?

今天跟随几个问题,我们一起探索下Mutex背后的设计。

(不用担心,不会有大段的源码分析出现在本文😳)

Read More

Dig101-Go之如何在函数内修改指针指向

Dig101: dig more, simplified more and know more

今天来看一个小问题:如何在函数内部修改一个指针(参数或接收者)指向,使其值的改变能反映在函数外部

直接上代码,这样可以么?

1
2
3
4
5
6
7
8
9
type ArgType struct {
A string
b int
}

func modifyPointerArg1(arg *ArgType) {
arg = &ArgType{"arg1", 1}
fmt.Println("inside modifyPointerArg1:", arg)
}

Read More