信号量和互斥锁
信号量是一种数据结构,在并行编程环境中,用于确保多个进程不会同时访问公共资源或关键部分。信号量用于避免死锁和竞争条件。互斥锁(互斥对象)也用于避免多个并发进程同时访问公共资源。
什么是信号量?
信号量是一种数据结构,用于向临界区提供互斥。信号量主要支持两个操作:等待(历史上称为P)和信号(历史上称为V)。等待操作阻塞一个进程,直到信号量打开,信号操作允许另一个进程(线程)进入。每个信号量都与一个等待进程队列相关联。当线程调用等待操作时,如果信号量是打开的,则线程可以继续。如果该信号量在线程调用等待操作时关闭,那么该线程将被阻塞,它必须在队列中等待。信号操作打开一个信号量,如果队列中已经有一个线程在等待,则允许该进程继续进行,如果队列中没有线程在等待,则信号将为下一个线程记住。有两种类型的信号量,称为互斥信号量和计数信号量。互斥信号量允许对资源的一次访问,计数信号量允许多个线程访问资源(有多个可用单元)。
什么是互斥锁?
当计算机应用程序启动时,它将创建一个互斥锁并将其附加到资源上。当资源被一个线程使用时,它被锁定,其他线程不能使用它。如果另一个线程想要使用相同的资源,它将不得不发出请求。然后,该线程将被放置在队列中,直到第一个线程使用该资源完成。当第一个线程使用完该资源时,锁将被移除,正在队列中等待的线程可以访问该资源。如果队列中有多个线程在等待,则以轮流的方式给予它们访问权限。实际上,当互斥锁在多个线程之间交替访问一个资源时,可以看到多个线程正在同时使用一个资源。但是在内部,在给定的时间内只有一个线程在访问资源。
信号量和互斥锁的区别是什么?
尽管在并行编程环境中,信号量和互斥对象都是用来实现互斥的,但它们有一些区别。互斥对象只允许单个线程使用一个资源或一个临界区,而信号量允许同时访问一个资源的次数有限(在允许的最大数量下)。使用互斥对象,其他想要访问该资源的线程必须在队列中等待,直到当前线程使用该资源完成。
留下一个回复