这一节将描述线程编程模型中主要的基本术语。

线程编程主要围绕:线程执行体、互斥量(共享数据区域)、通信机制(通常包含信号、广播)。

1.1.1 异步

异步表明事情可以相互独立的发生,除非有强加的依赖性。传统的计算机系统让所有的操作都是串行执行的,为了让它们并发,程序员必须使用额外的操作。

1.1.2 并发

在字典中,并发是指事情同时发生。但是在计算机中,并发不代表并行,并发通常表现为让串行发生的事情看着好像同时发生一样。并发描述单处理器下系统中线程和进程的行为特点。在POSIX中,并发的定义是要求“延迟调用线程的函数不应该导致其他线程无限制等待”。这个定义就反应了处理器不可能无限制等待某一个任务的完整执行,必然会对线程或者进程的执行过程进行调控,这种调控可以包括暂停、继续、终止等。

并发操作之间可能是是任意交错的,导致程序可以相互独立地执行(一个程序的执行不必等待另一个程序的执行完毕),但是并发不代表会同时执行任务,只是看起来似乎是同时执行。并发程序能利用异步能力的优势,在无关操作运行的过程中继续工作。

大部分程序拥有异步特点,但可能表现的不是很明显。例如:用户更喜欢异步界面,发送了相关输入操作给相关界面,不必等待相关界面处理完毕再返回,而是喜欢程序同时执行其他不需要等待的操作,等到有结果的时候再展现给用户。这方面对于慢速的I/O操作,多处理器系统特别重要。

1.1.3 单处理器和多处理器

单处理器是指一台计算机只有一个编程人员可见的执行单元。对于拥有超标量体系架构、向量或者其他数学或I/0协处理器的单一通用处理器,我们仍然把它当成单处理器。

多处理器是指一台计算机拥有多个处理器,它们共享一个指令集和物理内存。虽然处理器不必同等地访问所有的物理内存,但是每一个应该能够访问大部分内存。

1.1.4 并行

并行是并发序列同时执行。换句话说,软件中的“并行”和日常语言的“并发”含义相同,但是和计算机中的“并发”含义不同,计算机中的并行是指可以互相同时独立执行,没有任何相关执行耦合。

真正的并行只能在多处理器系统中存在,但是并发可以在单处理器和多处理器系统中均存在。并发能够在单处理器系统中存在是因为并发是并行的假象。并行要求程序能够同时执行多个操作,而并发只要求程序能够假装同时执行多个操作。

1.1.5 线程安全和可重入

线程安全是指代码能够被多个线程同时执行而不会产生灾难性结果。它不要求代码在多个线程中高效运行,只要求能够安全运行。大部分函数可以利用Pthreads提供的工具—-互斥量条件变量线程私有数据,实现线程安全。不需要保存永久状态的函数,可以通过整个函数调用的串行化来实现线程的安全。例如,在进入函数时加锁,在退出时解锁。这样的函数可以被多个线程执行,但是同一个时间内,只会被一个线程执行到。

更有效的方式是将线程安全函数分为多个小的临界区。这样就允许多个线程进入同一个函数,但是不能同时进入一个临界区。更好的方式是将代码改造为临界数据的保护而不是对于临界代码的保护,这样就可以令不会同时访问临界数据的线程完全的并行的执行。(强调对于临界数据的保护 优于 对于临界代码的保护

可重入”有时用来表示 “有效的线程安全”,即通过采用比将函数或库转换成一系列区域更为复杂的方式使代码成为线程安全的。通过引入互斥量和线程私有数据可以实现线程安全,但通过需要改变接口来使函数可重入。可重入的函数应该避免以来任何静态数据,最好避免依赖线程间任何形式的同步。可重入函数说白了就是可以重复调用的函数,主要针对于单线程程序,在多线程环境下对于共享数据还是要考虑同步问题。

通常,函数可以将状态保存在函数结构中,由调用者来负责状态数据的同步。

1.1.6 并发控制功能

并发系统必须提供基本的核心功能,包括创建并发执行的环境,并在你的库或者应用程序中对其进行控制,以下是并发系统都应该具有的功能。

  1. 执行环境”是并发实体的状态。并发系统必须提供创建、删除执行环境和独立维护它们状态的方式。它必须能够不时地保存好一个执行环境,而去执行另外一个执行环境。

  2. 调度”决定在某个给定时刻该执行哪个环境(环境组),并在不同的环境中切换。

  3. 同步”为并发执行的环境提供了协调访问共享资源的一种机制。这里的“同步”和字典中的同步含义是对立的。通常意义上,“同步”是指同时发生,而这里的“同步”代表“阻止同时发生”。在辞典中,“同步”的同义词“协调”—-同步就是让线程协调地完成工作的机制。

系统调用功能可以让线程执行知道它自愿让出CPU给其它线程为止,也可以提供时间片,使每个线程被迫周期性地让出CPU。可以提供多种调度策略,让程序针对每个线程实现的功能来选择各线程的调度方式。还可以实现“分类调度器”,来描述线程间的依赖关系。

同步 可以通过很多方式实现。其中最常见的是互斥量条件变量信号量事件。 还可以通过消息传递机制,如UNIX管道SOCKETPOSIX消息队列,或者是其它异步进程间(本地或者网络)的通信协议。任何通信协议里都包含某种同步机制,如果没有同步,则传输的数据会混乱

线程、互斥量、条件变量、是本系列笔记的主要话题。

文档更新时间: 2018-08-26 20:08   作者:李彪