线程同步与并发编程技术解析
1. 信号量(Semaphores)
信号量是用于进程同步的通用机制。一个(计数)信号量是一种数据结构,其定义如下:
struct sem{ int value; // 信号量(计数器)值 struct process *queue; // 阻塞进程的队列 }s;在使用之前,信号量必须用一个初始值和一个空的等待队列进行初始化。无论硬件平台如何,即无论是在单 CPU 系统还是多处理系统中,信号量的底层实现都保证每个信号量一次只能由一个执行实体操作,并且从执行实体的角度来看,对信号量的操作是原子(不可分割)或基本的。
信号量最著名的操作是 P 和 V,定义如下:
P(struct semaphore *s) { s->value--; if (s->value < 0) BLOCK(s); } V(struct semaphore *s) { s->value++; if (s->value <= 0) SIGNAL(s); }其中,BLOCK(s)将调用进程阻塞在信号量的等待队列中,SIGNAL(s)从信号量的等待队列中解除一个进程的阻塞。
信号量不是原始 Pthreads 标准的一部分,但现在大多数 Pthreads 支持 P