这主要是关于对这个概念的理解,这让我感到困惑。
Mutex意味着一个线程控制对共享资源的访问,执行操作并解锁,然后只有其他线程才能获得访问锁的权限。
二进制信号量类似于线程可以访问共享资源,但可以访问锁,而另一个线程可以解锁。
在我在here上看到的最后一个问题中,有人提到了"semaphores are more suitable for some synchronization problems like producer-consumer".
例如,我的问题是,如果生产者线程获得了锁并用数据填充了一些队列,而消费者同时解锁,难道就没有并发问题吗?
发布于 2010-10-23 11:27:10
我会尽我所能把混乱弄清楚。我将解释这些概念的传统定义方式。问题是,人们开始混淆其中许多概念的含义,并由此产生许多混淆。
每当我们有一段代码修改不同进程或线程之间共享的内存(比如变量)时,我们就有一个关键部分。如果我们不注意正确地同步这段代码,那么我们就会得到bug。关键部分的一个例子是生产者将元素添加到某种类型的共享容器中。
同步关键部分的一种方法是执行互斥。互斥意味着一次只有一个进程或线程可以执行关键部分并访问共享内存段。请注意,互斥并不是它本身的一种机制,它是一项我们可以通过不同方式执行的原则。有些人说锁和二进制信号量是互斥的,但这会混淆概念,从而导致混淆。
二进制信号量是执行互斥的一种方法。每当一个进程想要访问互斥对象时,它都可以提供信号量。如果此时有另一个保存信号量的进程,则此操作将阻塞。因此,我们相互排斥。一旦一个进程用互斥完成,我们就释放信号量,让其他进程进入互斥。通过这种方式,我们可以通过二进制信号量实现互斥,但这绝不是二进制信号量的唯一可能应用。
信号量对于生产者-消费者问题是很好的,因为它们可以具有任意的自然数,而不仅仅是在二进制信号量的情况下0和1。这在同步生产者-消费者问题时非常有用,因为您可以让信号量的值包含可用元素的数量。如果元素数降至零,则信号量操作将自动阻塞。
我意识到对生产者-消费者问题的解释有点简短,我鼓励您看看使用信号量的解决方案,并将这些解决方案与使用其他同步结构(如监视器或消息传递)的其他解决方案进行比较。我发现它很有启发性。
https://stackoverflow.com/questions/3993790
复制相似问题