2010-10-22 38 views
5

这主要是关于概念的理解,这让我感到困惑。生产者 - 消费者模型 - 二进制信号量或互斥量?

互斥意味着一个线程需要的共享资源的访问的控制,执行操作和解锁,然后仅其他线程可以访问锁定

二进制信号量就像一个线程可以访问共享资源,但获得访问锁定,而另一个线程可以解锁

在上,我看到了here的问题,有人提到"semaphores are more suitable for some synchronization problems like producer-consumer".

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

回答

11

我会尽我所能地理清困惑。我将按照传统定义的方式解释概念。问题在于人们开始混合这些概念中的许多概念,并由此产生许多混淆。

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

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

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

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

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