编程中的协程、事件处理与相关概念解析
1. 挥发性变量(Volatile Variable)
在编程里,当数据被写入内存时,在处理程序中是可见的,但缓存在寄存器里的更改可能会丢失。为解决这一局限,C 语言允许程序员指定某些变量为挥发性变量。挥发性变量指的是其内存中的值可能“自发”改变的变量,例如受 I/O 设备活动或并发控制线程的影响。C 语言的实现要求在写入挥发性变量时将其存储到内存,读取时从内存加载。若处理程序需要查看受保护代码可能修改的变量的更改,程序员必须在变量声明中包含 volatile
关键字。
2. 协程(Coroutines)
了解运行时栈的布局后,我们可以探讨更通用的控制抽象的实现,特别是协程。协程和延续(continuation)类似,由闭包(代码地址和引用环境)表示,可通过非局部跳转(这里是名为 transfer
的特殊操作)进行跳转。延续和协程的主要区别在于,延续是常量,创建后不会改变;而协程每次运行都会改变。跳转到延续时,旧的程序计数器会丢失,除非显式创建新的延续来保存它;从一个协程转移到另一个协程时,旧的程序计数器会被保存,离开的协程会更新以反映这一点。也就是说,多次跳转到同一个延续,每次跳转都从相同位置开始;多次转移到同一个协程,每次跳转都从上一次结束的地方继续。
协程是并发存在但一次只执行一个的执行上下文,它们通过名称显式地相互转移控制。协程可用于实现迭代器和线程,在某些服务器和离散事件模拟中也很有用。线程历史悠久,许多语言都支持;而协程作为用户级编程抽象不太常见,历史上提供协程的重要语言有 Simula 和 Modula - 2。