1 linux 信号量机制(semaphore) 信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问
当公共资源增加时,调用函数sem_post()增加信号量
只有当信号量值大于0时,才能使用公共资源,使用后,函数sem_wait()减少信号量
函数sem_trywait()和函数pthread_ mutex_trylock()起同样的作用,它是函数sem_wait()的非阻塞版本
它们都在头文件/usr/include/semaphore
信号量的数据类型为结构 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 个线程,其中两个线程负责从文件读取数据到公共的缓冲区,另两个线程从缓冲区读取数据作不同的处理(加和乘运算)