基于事件驱动的并发

基于事件驱动的并发模式出现在 GUI 应用程序中,还有某些服务器编程中,比如说 node-js,但它们的根基还在基于 Unix 系统提供的底层功能构建起来的。

多线程编程有两个问题,第一个是编写正确的多线程程序是个很有挑战的事情,第二个是多线程环境下编程者没有权力控制线程的调度、线程的调度依赖底层 OS。这可能并不能如编程者所愿。

最基本的 Idea:事件循环

The approac......

信号量 Semaphores

Semaphores 这个概念也是由迪杰斯特拉发明的。在这节你将会看到,信号量可以用来实现锁和条件变量。

定义

A semaphore is an object with an integer value that we can manipulate with two routines;

这两个 routines 在 POSIX 中分别叫是 sem_wait 和 sem_post。......

条件变量

现实中,我们经常会碰到一种场景,那就是希望等待某个条件满足的时候被通知。

条件变量的概念就从此来了。这篇的分析也比较长,请大家耐心。

定义

A condition variable is an explicit queue that threads can put themselves on when some state of execution (i.e., some condi......

基于锁的数据结构

上篇笔记介绍了锁的实现大概是怎样的,这篇笔记我们讲解一些基于锁的数据结构。

给某些数据结构可以使得数据结构支持多线程环境下使用,让这些数据结构变得 线程安全(thread-safe)。

当然文中也不会记录所有的数据结构,这得要成千上万篇论文的篇幅去讲述,这里还是抛砖引玉。

Concurrent Counter

A Counter Without Locks

typedef......

本篇将会探讨锁的实现,篇幅相比之前的笔记有点长,大家见谅。

锁的基本概念

锁其实一个变量,我们在里面保存了一些重要的信息(包括锁的状态),比如说当前是哪个线程拥有了这把锁,或者是一个想请求这把锁的队列,但这些信息是存在 lock_t 里的。(熟悉 C 语言的盆友可以猜出,这是个结构体)

锁提供给程序员最小化调度机制。

道理就是,具体选择哪个进程、线程执行代码是有操作系统控制的......

并发 - 引言

通过前面的一大节,我们了解了操作系统是如何给进程提供一个独占 CPU 、独占大部分地址空间的虚拟假象。

这部分,书中重点发关注另外一个虚拟抽象,线程(Thread)。

前面的文章我们都是的执行流都只有一个,想要另外一个执行流,唯有多进程的方式。而多线程程序,运行一个进程拥有多个执行流。不同的是,进程是独立的,线程是共享所属进程的资源的。

线程的并发执行当然涉及到上下文切换。......