什么是信号量?
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。信号量就是进程、线程之间通信的机制。有名信号量支持不同进程之间的通信,无名信号量只支持同一个进程内不同线程的通信。
虽然信号和信号量都是整数,但是信号量并不是信号,信号是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。
信号量类型
记录型信号量(record semaphore):每个信号量s除一个整数值s.value(计数)外,还有一个进程等待队列s.L。
二进制信号量(binary semaphore):只允许信号量取0或1值。
Python信号量使用
import threading,timeclass myThread(threading.Thread):def run(self):semaphore.acquire()//业务逻辑处理semaphore.release()if __name__=="__main__":semaphore=threading.Semaphore(5)threads=[]for i in range(100):threads.append(myThread())for t in threads:t.start()
Java信号量使用
public class SemaphoreService {private final Semaphore permit = new Semaphore(10, true);public void process(){try{permit.acquire();//业务逻辑处理} catch (InterruptedException e) {e.printStackTrace();} finally {permit.release();}}}
文章转载自架构师成长,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




