您的位置:首页 > 大数据 > 人工智能

信号量释放和等待函数sem_post()和sem_wait()

2017-02-18 13:14 211 查看
信号量:

信号量是IPC结构中的一种,是进程间通信的一种方法,也可以解决同一进程不同线程之间的通信问题。它是用来保证两个或多个关键代码段不被并发调用,防止多个进程同时对共享资源进行操作。

原理:

在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。

形象理解:

以一个停车场的运作为例。假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。

在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。

两种操作:

抽象的来讲,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。

1. Wait(等待)

当一个线程调用Wait操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列),直到信号量大于等于一时。

2. Release(释放)

实际上是在信号量上执行加一操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为释放了由信号量守护的资源。

两个函数:

sem_post函数(函数原型 int sem_post(sem_t *sem);)

作用是给信号量的值加上一个“1”。 当有线程阻塞在这个信号量上时,调用这个函数会使其中一个线程不在阻塞,选择机制是有线程的调度策略决定的。

sem_wait函数(函数原型 int sem_wait(sem_t * sem);)

它的作用是从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法。

一种使用方法:

可以使用信号量完成类似于传递signal的功能:

某一个线程要在一定条件下完成特定功能,由其他多个线程提供条件。此时,其他线程调用sem_post()使信号量加一,本线程调用sem_wait()函数阻塞等待,信号量来了方可退出阻塞。

此种情况本线程只调用sem_wait(),之后不调用sem_post()。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: