用于使用信号量计数,而不是一个二值互斥典型的例子是,当你有可用资源的有限数量的是:a)可互换和b)多于一个。
举例来说,如果你想允许最多10个读者在一次访问一个数据库,你可以使用初始化至10的计数信号来限制对资源的访问。每个读者在访问资源之前都必须获取信号量,并减少可用的计数。一旦计数达到0(即10个读取器已经访问并且仍然使用数据库),所有其他读取器都被锁定。一旦读者结束,他们会将信号量计数返回1,表示他们不再使用该资源,而其他一些读者现在可以获得信号锁并取而代之。
然而,信号计数,就像所有其他的同步原语,有许多用例,它只是一个逆向思考的问题。您可能会发现,使用信号量可以更轻松,更直接地实现您使用互斥锁和其他逻辑解决的许多问题。互斥量是信号量的一个子集,也就是说,你可以用一个信号量完成任何你可以用一个互斥量完成的任务(简单地将计数设置为1),但是有一些事情可以用信号量来完成,不能用一个互斥体完成。
在一天结束的时候,任何一个同步原语一般是够做任何事(认为它为“图灵完备”的线程同步,以bastardize这个词)。但是,每种方法都适用于不同的应用程序,虽然您可以强制某人通过某种定制和附加胶水来执行您的出价,但有可能不同的同步原语更适合这项工作。
OP询问二进制信号量与(总是二进制)互斥量,不计算信号量与互斥量。 – 2012-07-17 22:50:03