POSIX信号量与System V信号量作用相同,都用于同步操作,达到无冲突的访问共享资源的目的,但POSIX信号量可用于线程间同步。
初始化信号量:
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
参数:
pshared:0表⽰示线程间共享,⾮非零表⽰示进程间共享。
value:信号量初始值。
销毁信号量:
#include <semaphore.h>
int sem_destroy(sem_t *sem);
等待信号量:
功能:等待信号量,会将信号量的值减1。
#include <semaphore.h>
int sem_wait(sem_t *sem);
发布信号量:
功能:发布信号量,表⽰示资源使⽤用完毕,可以归还资源了。将信号量值加1。
#include <semaphore.h>
int sem_post(sem_t *sem);
在这里用POSIX信号量来实现生产者消费者模型。
生产者消费者模型中的“123”:
一个场所(线程共享区域);
两个对象(生产者和消费者);
三种关系(生产者与生产者:互斥;生产者与消费者:互斥且同步;消费者与消费者:互斥);
给出一片有十个单元的空间,两个生产者向这片空间放数据,两个消费者从这片空间取出数据,而同一时刻在这片空间进行操作的对象只能有一个;同时,当空间中的数据都被取出时,消费者就必须停下等待生产者放入新数据,而如果空间中数据已经满了,生产者必须停下等待消费者取出数据有“空位置”后才能继续放。可以将这片空间想象成环形,其整个存放过程及规则可以这样来看: