生产者 - 消费者模型 - 二进制信号量还是互斥量?

时间:2010-10-22 04:04:35

标签: concurrency mutex semaphore producer-consumer

这主要是关于这个概念的理解,这让我很困惑。

Mutex 表示一个线程控制共享资源的访问权限,执行操作并解锁它,然后只有其他线程可以获得锁定权限

虽然二进制信号量就像一个线程可以获得对共享资源的访问但可以获得对该锁的访问权限,而另一个线程可以解锁它

在我看到here的最后一个问题时,有人提到"semaphores are more suitable for some synchronization problems like producer-consumer".

我的问题是,例如,如果生产者线程已经获得锁定并用数据填充一些队列,并且消费者同时解锁它,是不是有任何并发​​问题?

1 个答案:

答案 0 :(得分:11)

我会尽力解决混乱问题。我将按照传统方式定义概念。问题在于人们开始混淆许多这些概念的含义,并且会产生很多混淆。

每当我们有一段修改了不同进程或线程之间共享的内存(比如一个变量)的代码时,我们就会有一个关键部分。如果我们不小心正确地同步这些代码,那么我们将得到错误。关键部分的一个示例是生产者将元素添加到某种共享容器中。

同步关键部分的一种方法是强制执行互斥。相互排斥意味着一次只有一个进程或线程可以执行关键部分并获得对共享内存的访问权限。请注意,互斥不是一种自我机制,这是我们可以通过不同方式强制执行的原则。有些人将锁和二进制信号量称为互斥量,但这会混淆概念,从而导致混淆。

二进制信号量是一种强制互斥的方法。每当进程想要访问互斥锁时,它都可以获取信号量。如果此时有另一个进程持有信号量,则此操作将被阻止。因此,我们互相排斥。一旦使用互斥锁完成一个进程,我们就会释放信号量,让其他进程进入互斥锁。通过这种方式,我们可以用二进制信号量实现互斥,但它绝不是二进制信号量唯一可能的应用。

信号量对生产者 - 消费者问题很好,因为它们可以采用任意自然数,而不仅仅是二进制信号量的0和1。这在同步生产者 - 消费者问题时非常有用,因为您可以让信号量的值包含可用元素的数量。如果元素数量减少到零,那么信号量操作将自动阻止。

我意识到生产者 - 消费者问题的解释有点简短,我鼓励您查看使用信号量的解决方案,并将这些解决方案与使用其他同步结构(如监视器或消息传递)的其他解决方案进行比较。我发现它非常有启发性。