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

Concurrency 生产者-消费者模型-二进制信号量还是互斥?,concurrency,mutex,semaphore,producer-consumer,Concurrency,Mutex,Semaphore,Producer Consumer,这主要是关于对这个概念的理解,这让我感到困惑 互斥意味着一个线程控制对共享资源的访问,执行操作并解锁它,然后只有其他线程可以访问锁 而二进制信号量就像一个线程可以访问共享资源,但可以访问锁,而另一个线程可以解锁它 在我看到的最后一个问题中,提到了“信号量更适合于一些同步问题,如生产者-消费者问题”。 我的问题是,例如,如果生产者线程获得了锁,并用数据填充了一些队列,而消费者同时解锁了它,是否存在任何并发问题 我会尽我所能把困惑弄清楚。我将以传统的定义方式解释这些概念。问题是,人们开始混淆其中许多

这主要是关于对这个概念的理解,这让我感到困惑

互斥意味着一个线程控制对共享资源的访问,执行操作并解锁它,然后只有其他线程可以访问锁

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

在我看到的最后一个问题中,提到了
“信号量更适合于一些同步问题,如生产者-消费者问题”。


我的问题是,例如,如果生产者线程获得了锁,并用数据填充了一些队列,而消费者同时解锁了它,是否存在任何并发问题

我会尽我所能把困惑弄清楚。我将以传统的定义方式解释这些概念。问题是,人们开始混淆其中许多概念的含义,由此产生了许多混乱

每当我们有一段代码修改不同进程或线程之间共享的内存位(比如变量),我们就有一个关键部分。如果我们不注意正确地同步这段代码,那么就会出现bug。关键部分的一个例子是生产者向某种共享容器添加元素

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

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

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

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