第一步:初始化信号量 sem_init
int sem_init(sem_t*sem,int pshared,unsigned int value)
参数说明:
- sem:指向要初始化的信号量的指针。
- pshared:控制信号量的共享选项。如果其值为0,则表示信号量仅在当前进程的线程之间共享;如果非零,则表示信号量可以在多个进程之间共享。
- value:指定信号量的初始值,即信号量资源的可用数量
返回值:
如果成功,
sem_init
返回0。如果失败,返回-1,并设置errno以指示错误原因
函数是POSIX信号量操作中的一个关键函数,用于初始化一个无名信号量
#include<stdio.h>
#include<semaphore.h>
int main
{
sem_t sem;
if(sem_init(&sem,0,1)<0)
{perror("ssem init err");return -1;}
return 0;
}
第二步:申请资源 sem_wait
int sem_wait(sem_t *sem)
功能:申请资源
当信号量的值大于0时,表示有资源可以用,则继续执行,同时对信号量减1;当信号量的值等于0时,表示没有资源可以使用,函数阻塞。
返回值:
成功0;失败-1;
参数:sem:信号量对象
#include<stdio.h>
#include<semaphore>
int main
{
sem_t sem;
if(sem_init(&sem,0,1)<0)
{perror("sem init err");return -1;}
///申请资源
sem_wait(&sem);
printf("hello");
sem_wait(&sem);///阻塞状态
printf(“nihao”)//打印不出因为阻塞
return0;
}
第三步:释放资源 sem_post
int sem_post(sem_t *sem)
功能:
释放资源 v操作
参数:&sem信号量
返回值:
成功返回0;失败返回-1,并设置
errno
为EPERM
或EINVAL
,表示信号量无效或操作失败
注意:
在使用sem_post
之前必须先初始化信号量,通常通过sem_init
函数进行初始化。
sem_wait(&sem);//申请资源
printf("hello\n");
sem_post(&sem);//释放资源
sem_wait(&sem);//进入阻塞状态
printf("1");
return 0;
调用sem_post
时需要链接相关的库文件,否则会出现编译错误“undefined reference to `sem_post'”。