信号量semaphore(信号量semaphore c语言)

skyadmin 24 2023-05-03

本文目录一览:

Semaphore信号量的底层原理

Semaphore(信号量) 是一个线程同步结构,用于在线程间传递信号,以避免出现信号丢失(译者注:下文会具体介绍),或者像锁一样用于保护一个关键区域。自从5.0开始,jdk在java.util.concurrent包里提供了Semaphore 的官方实现,因此大家不需要自己去实现Semaphore。但是还是很有必要去熟悉如何使用Semaphore及其背后的原理

本文的涉及的主题如下:

一、简单的Semaphore实现

下面是一个信号量的简单实现:

查看源代码打印帮助

Take方法发出一个被存放在Semaphore内部的信号,而Release方法则等待一个信号,当其接收到信号后,标记位signal被清空,然后该方法终止。

使用这个semaphore可以避免错失某些信号通知。用take方法来代替notify,release方法来代替wait。如果某线程在调用缓孙慧release等待之前调用take方法,那么调用release方法的线程仍然知道take方法已经被某个线程调用过了,因为该Semaphore内部保存了take方法发出的信号。而wait和notify方法就没有这样的功能。

当用semaphore来产生信号时,take和release这两个方法名看起来有点奇怪。这两个名字来源于后面把semaphore当做锁的例子,后面会详细介绍这个例子,在该例子中,take和release这两个名字会变得很合理。

二、可计数的Semaphore

上面提到的Semaphore的简单实现并没有计算通过调用take方法所产生信号的数量。可凯枯以把它改造成具有计数功能的Semaphore。下面是一个可计数的Semaphore的简单实现。

三、有上限的Semaphore

上面的CountingSemaphore并没有限制信号的数量。下面的代码将CountingSemaphore改造成一个信号数量有上限的BoundedSemaphore。

在BoundedSemaphore中,当已经产生的信号扰答数量达到了上限,take方法将阻塞新的信号产生请求,直到某个线程调用release方法后,被阻塞于take方法的线程才能传递自己的信号。

关于 semaphore 信号量

dispatch_semaphore 信号量基于计数器的一种多线程同步机制。在多个线程访问共有资源时候,会因为多线程的特性而引发数据出错的问题。

和普通锁不一样,这个可以精细的控制并发量;

dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);

会创建三个信号量

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

每次wait都会消耗一个信号量,等待时间可以设置,这里设信兆置为一直等待,如果当前信号量(semaphore)小于1,则一直等待

dispatch_semaphore_signal(semaphore);

发滑老租送信号含谈量,发送一次,信号量+1

下面的demo可以并发执行 ,但每次只能并发3个线程;

因为消耗3次信号量后,就进入等待状态,直到sleep 2s完成后,会发送信号量dispatch_semaphore_signal

然后继续执行;

所以每次输出3个,直到循环完成;

信号量:二进位信号量和计数信号量

信号量(semaphore)是一个被线程共享的非负变量。信号量是一个发信号的机制。一个等待一个信号量的线程可以被其他线程通知(signal)。这个机制通过 wait 和 signal 两个原子操作陆旦(atomic operations)来实现进程同早咐扰步。

一个信号量要么允许访问资源,要么不允许访问资源。二者只能选其一。而具体是哪一种,则要看设置。

下面是信号量的一些特点:

最常见的两种信号量:

这种信号量用一个计数来帮助任务被获取(be acquired)或释放(be released)数次。

具体机制如下图所示:

二进位信号量和计数信号量非常相似,但是他们的计数值简纳只能限制在0和1两个数字。在这种信号量下,等待(wait)操作只能在信号量等于1(semaphore = 1)时工作。而通知(signal)操作只有在信号量等于0(semaphore = 0)时才能成功。二进位信号量的实现要比计数信号量的实现要简单。

信号量的等待操作(wait operation)和通知操作(signal operation)是用来实现同步的。信号量操作的不得是为了互相独立。

等待操作(wait operation)用来帮助我们控制任务是否可以进入关键的部分。当信号量是正的时候,信号量将被减一。如果当信号量为负数或者零的时候,等待操作不执行任何操作。

当信号量被递减后,信号量值为负数或者零时,该指令将被挂起保持,直到信号量重新满足大于0的条件。

通知操作(signal operation)是用于控制一个任务退出某个重要部分。当信号量的值是负的时候,信号量将被加一。

下面列举了计数信号量和二进位信号量的主要不同:

关于信号量semaphore和信号量semaphore c语言的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注云尚网络www.ysfad.net。

上一篇:重庆森林电影(重庆森林电影简介)
下一篇:爱站工具包的模块(爱站工具包模块 3482c∩)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~