进程间通信posix信号量使用总结

posix信号量分为命名信号量和基于内存的信号量

posix命名信号量,使用posix名字表示,可用于线程或进程间同步

1.sem_open

函数头文件: #include <semaphore.h>

函数原型:sem_t *sem_open(const char *name, int oflag, ... /* mode_t mode, unsigned int value */ );
函数功能:创建一个新的有名信号量或打开一个已存在的有名信号量 返回值:若成功则返回指向信号量的指针,该指针用作sem_close(),sem_wait(),sem_trywait(),sem_post(),sem_getvalue()的参数,若出错则返回SEM_FAILED

参数说明:name为路径名;oflag可以是0,O_CREAT,O_CREAT|O_EXCL; mode是可选参数,在O_CREAT有效; value可选,用于指定信号量的初值,范围为0-SEM_VALUE_MAX ,二值信号量的初始值通常为1,计数信号量初始值通常大于1

 

2.sem_close

int sem_close(sem_t* sem)

功能:关闭由sem_open()打开的有名信号量

返回值:成功返回0,失败返回-1

 

3.sem_unlink

int sem_unlink(const char* name)

功能:从系统中真正删除信号量

返回值:成功返回0,失败返回-1

 

POSIX基于内存信号量:存放在共享内存去中,可用于进程或线程间同步,代码中一般使用的是这种方式

1.sem_init

int sem_init(sem_t* sem, int shared, unsigned int value)

功能:初始化共享内存的无名信号量

返回值:出错返回-1

参数:sem是信号量的指针; shared为0是共享线程,为1是进程共享; value为信号量初始值

 

2.sem_destory

int sem_destory(sem_t * sem)

功能:销毁sem_init()初始化的无名信号量

返回值:成功返回0,出错返回-1

 

信号量的PV操作函数

sem_wait表示获取信号量,信号值大于0时,会使信号值减1,信号值等于0时,sem_wait会阻塞,使调用的进程或者线程进入休眠。sem_post释放信号量,会使信号值加1

3. int sem_wait(sem_t* sem)

功能:测试指定信号量的值,如果该值大于0,会使信号值减1并立即返回,如果该值等于0,则调用的进程或者线程阻塞进入修满,直到该值大于0,此时会再减1,函数随后返回。

 

4. int sem_post(sem_t* sem)

功能:把所指定的信号量加1,然后唤醒正在等待该信号量变为正数的任意进程或线程

返回值:成功返回0,出错返回-1

 

5. int sem_getvalue(sem_t* sem, int* val)
函数功能:获取当前信号量的值,通过val输出参数返回,如果当前信号量已经上锁(即同步对象不可用),那么返回值为0,或为负数,其绝对值就是等待该信号量解锁的线程数。

返回值:若成功则返回0,出错则返回-1

 

总结:

1.信号量的本质是一个数字,通过初始值,PV两种操作来判断信号量的值是否为0,为0会导致调用sem_wait()的进程阻塞(进程阻塞就是进程中某个函数阻塞了)

2.代码中添加信号量不改变原有的任何代码逻辑的,只是通过sem_wait是否会阻塞来改变多进程或多进程的执行顺序,在信号量为0时,sem_wait会阻塞,直到其他进程或者线程释放信号量,sem_wait才会返回继续执行代码。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值