linux 信号量机制(semaphore)
信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当
公共资源增加时,调用函数 sem_post()增加信号量。只有当信号量值大于0时,
才能使用公共资源,使用后,函数 sem_wait()减少信号量。函数 sem_trywait()
和函数 pthread_ mutex_trylock()起同样的作用,它是函数 sem_wait()的非阻塞
版本。它们都在头文件/usr/include/semaphore.h 中定义。
信 号 量 的 数 据 类 型 为 结 构 sem_t , 它 本 质 上 是 一 个 长 整 型 的 数 。 函 数
sem_init()用来初始化一个信号量。它的原型为:
extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));
sem 为指向信号量结构的一个指针;pshared 不为0时此信号量在进程间共享,
否则只能为当前进程的所有线程共享;value 给出了信号量的初始值。
函数 sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量
上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度
策略决定的。
函数 sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量 sem 的值大于 0,
解除阻塞后将 sem 的值减一,表明公共资源经使用后减少。
函数 sem_trywait ( sem_t *sem )是函数 sem_wait()的非阻塞版本,它直接将信
号量 sem 的值减一。
函数 sem_destroy(sem_t *sem)用来释放信号量 sem。
例 1:使用信号量。例子中一共有 4 个线程,其中两个线程负责从文件读取数据到公
共的缓冲区,另两个线程从缓冲区读取数据作不同的处理(加和乘运算)。
/* File sem.c */
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define MAXSTACK 100
int stack[MAXSTACK][2];
int size=0;
sem_t sem;
/* 从文件 1.dat 读取数据,每读一次,信号量加一*/
void ReadData1(void){
FILE *fp=fopen("1.dat","r");
while(!feof(fp)){
fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);
sem_post(&sem);
++size;
1