POSIX信号量——匿名信号量

目录

1、Creat

2、Wait

3、Post

4、GetValue

5、Delete


  • POSIX 信号量有两种类型:匿名信号量和命名信号量,其本质是计数型信号量,计数型信号量参考:https://blog.csdn.net/Liangren_/article/details/108593071
  • 匿名信号量只存在于内存中,这就要求使用信号量的线程必须可以访问内存,因此匿名信号量可以应用于同一进程中线程间的通信,不同的进程间需要映射这段内存到自己的地址空间。
  • 命名信号量可以通过名字访问,因此可以应用于进程间的通信
POSIX 信号量被定义为 sem_t 类型,使用前应该定义 sem_t 类型的变量,如:
sem_t sem;
POSIX匿名信号量

1、Creat

一个 POSIX 匿名信号量必须要调用 sem_init 函数创建之后才能使用。
#include <semaphore.h>
int sem_init(sem_t *psem, int pshared, unsigned int value);
函数 sem_init 原型分析:
  • 此函数成功返回 0,失败返回-1 并设置错误号;
  • 输出参数 psem 返回 POSIX 信号量的指针;
  • 参数 pshared 标识了 POSIX 信号量是否进程共享(SylixOS 未用此项);
  • 参数 value POSIX 信号量的初始值。

2、Wait

线程如果需要等待一个 POSIX 信号量,可以调用 sem_wait 函数,中断服务程序不能调用任何的 POSIX 信号量 API。释放一个信号量使用 sem_post 函数。
#include <semaphore.h>
int sem_wait(sem_t *psem);
int sem_trywait(sem_t *psem);
int sem_timedwait(sem_t *psem, const struct timespec *abs_timeout);
int sem_reltimedwait_np(sem_t *psem, const struct timespec *rel_timeout);

以上几个函数原型分析:

  • 函数成功返回 0,失败返回-1 并设置错误号;
  • 参数 psem POSIX 信号量的指针;
  • 参数 timeout 是等待的绝对超时时间;
  • 参数 rel_timeout 是等待的相对超时时间。
sem_trywait sem_wait 的“尝试等待”版本,在 POSIX 信号量的值为 0 时, sem_wait将阻塞直至被唤醒,而 sem_trywait 将立即返回。
sem_timedwait sem_wait 的带等待超时时间的版本, timeout 为等待的绝对超时时间,用时在当前时间的基础上再加上一个相对超时时间就能得到绝对超时时间 timeout,如:
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 1;
sem_timedwait(&sem, &ts);

sem_reltimedwait_np sem_timedwait 的非 POSIX 标准版本,参数 rel_timeout 为等待的相对超时时间,如:

struct timespec ts;
ts.tv_sec = 1;
ts.tv_nsec = 0;
sem_reltimedwait_np(&sem, &ts);

可以看出在使用上,sem_reltimedwait_np sem_timedwait 更方便。

3、Post

#include <semaphore.h>
int sem_post(sem_t *psem);

函数 sem_post 原型分析:

  • 此函数成功返回 0,失败返回-1 并设置错误号;
  • 参数 psem POSIX 信号量的指针。

4、GetValue

sem_getvalue 函数可以用来检索信号量值。需要注意的是,我们试图要使用刚读出来的
值的时候,信号量值可能已经变化了,除非使用其他同步机制来避免这种竞争,否则
sem_getvalue 函数不建议使用。
#include <semaphore.h>
int sem_getvalue(sem_t *psem, int *pivalue);

函数 sem_getvalue 原型分析:

  • 此函数成功返回 0,失败返回-1 并设置错误号;
  • 参数 psem POSIX 信号量的指针;
  • 输出参数 pivalue 用于接收 POSIX 信号量的当前计数值。

5、Delete

当一个 POSIX 匿名信号量使用完毕后(并确保以后也不再使用),应该调用 sem_destroy
函数删除它, SylixOS 会回收该信号量占用的内核资源。
#include <semaphore.h>
int sem_destroy(sem_t *psem);

函数 sem_destroy 原型分析:

  • 此函数返回错误号;
  • 参数 psem POSIX 信号量的指针;

猜你喜欢

转载自blog.csdn.net/Liangren_/article/details/112307232