南京排名推广(南京产品推广)
24
2023-05-03
本文目录一览:
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方法的线程才能传递自己的信号。
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。
发表评论
暂时没有评论,来抢沙发吧~