/images/hugo/avatar.png

WaitGroup

WaitGroup 任务编排

1. WaitGroup 使用

WaitGroup 很简单,就是 package sync 用来做任务编排的一个并发原语。它要解决的就是并发 - 等待的问题: goroutine A 等待一组 goroutine 全部完成。

很多操作系统和编程语言都提供了类似的并发原语。比如,Linux 中的 barrier、Pthread(POSIX 线程)中的 barrier、C++ 中的 std::barrier、Java 中的 CyclicBarrier 和 CountDownLatch 等。

RWMutex

读写锁 RWMutex

1. RWMutex 使用

标准库中的 RWMutex 是一个 reader/writer 互斥锁,用来解决并发读写问题,特别适用于读多写少的场景。RWMutex 在某一时刻只能由任意数量的 reader 持有,或者是只被单个的 writer 持有。

Mutex 扩展

如何基于 Mutex 实现一个可重入锁

1. Mutex 的扩展

上一节我们介绍了 Mutex 的实现原理,这一节我们来看看如何基于标准库的 Mutex 来扩展 Mutex 提供的并发原语,包括:

  1. 实现一个可重入锁
  2. TryLock
  3. 获取等待者的数量
  4. 实现一个线程安全的队列

2. 可重入锁

实现可重入锁的关键是要锁能记住当前哪个 goroutine 持有锁,这里有两个方案:

Go Mutex 设计与实现

Go 第一个并发原语 Mutex 互斥锁

1. Mutex 的使用

互斥锁是最基本的并发原语,使用互斥锁,限定临界区只能同时由一个线程持有。基本上所有编程语言都会提供,Go 中互斥锁为 Mutex,Mutex 位于标准库 sync 中,其实现了 sync 中的 Locker 接口:

go API 设计

前面我们介绍 Go 项目工程化提到了 /api 目录。这目录是协议定义目录,用于存放约定项目接口的 IDL 文件。按照现在的主流基本都是 Protobuf 文件。Protobuf 的管理和共享就是今天的话题。