信号量本质上是一种非负的整数计数器,用来控制对公共资源的访问。当信号量值大于0时则可以访问,否则将阻塞。
PV原语是对信号量的操作,P操作减一、V操作加一。
初始化:
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
pshared:为0,信号量在线程间共享,不为0在进程间共享
value:初始值
返回值:成功0失败-1
销毁:
int sem_destroy(sem_t *sem);
返回值:成功0失败-1
P操作:
int sem_wait(sem_t *sem);
返回值:成功0失败-1
int sem_trywait(sem_t *sem); //非阻塞
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); //限时尝试获取
struct timespec{
time_t tv_sec;
long tv_nsec;
}
V操作:
int sem_post(sem_t *sem);
返回值:成功0失败-1
获取值:
int sem_getvalue(sem_t *sem, int *sval);
sval:保存信号量值的地址
返回值:成功0失败-1
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>
sem_t sema;
sem_t semb;
sem_t semc;
void* funa(void* arg)
{
for(int i=0;i<5;i++)
{
sem_wait(&sema);//ps1;
printf("A");
fflush(stdout);
sem_post(&semb);//vs2
}
}
void* funb(void* arg)
{
for(int i=0;i<5;i++)
{
sem_wait(&semb);//psb;
printf("B");
fflush(stdout);
sem_post(&semc);//vsc
}
}
void * func(void *arg)
{
for(int i=0;i<5;i++)
{
sem_wait(&semc);
printf("C");
fflush(stdout);
sem_post(&sema);
}
}
int main()
{
sem_init(&sema,0,1);
sem_init(&semb,0,0);
sem_init(&semc,0,0);
pthread_t id1,id2,id3;
pthread_create(&id1,NULL,funa,NULL);
pthread_create(&id2,NULL,funb,NULL);
pthread_create(&id3,NULL,func,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_join(id3,NULL);
sem_destroy(&sema);
sem_destroy(&semb);
sem_destroy(&semc);
exit(0);
}