多处理器编程与线程池技术详解
1. 多处理器底层架构
线程通过线程同步例程来同步对共享存储位置的访问。借助线程同步,在共享内存多处理器上运行程序与在单处理器上运行程序具有相同的效果。然而,在许多情况下,程序员可能会试图利用多处理器的特性,使用一些“技巧”来避免使用同步例程。但实际上,这些技巧可能存在风险。
1.1 多处理器主要组件
多处理器的主要组件包括:
- 处理器:包含核心及其线程,用于运行程序。
- 存储缓冲区:连接处理器和其缓存。
- 缓存:保存最近访问或修改的存储位置的内容。
- 内存:主要存储设备,由所有处理器共享。
1.2 传统模型与缓存
在简单的传统模型中,多处理器的行为就好像处理器直接连接到内存一样:当一个处理器向某个位置存储数据,另一个处理器立即从同一位置加载数据时,第二个处理器会加载第一个处理器所存储的数据。
缓存可以用来加快平均内存访问速度。当各个缓存之间保持一致时,就能实现所需的语义。然而,这种简单方法存在一个问题,即处理器常常需要延迟,以确保实现所需的语义。许多现代多处理器采用各种技术来防止这种延迟,但不幸的是,这些技术改变了内存模型的语义。下面通过两个例子来解释其中两种技术及其影响。
2. 共享内存多处理器与生产者 - 消费者问题
2.1 生产者 - 消费者问题示例
以下是生产者 - 消费者问题在共享内存多处理器上的示例代码:
char buffer[BSIZE]; unsigned int in = 0;