gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:13:13 32 4
gpt4 key购买 nike

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

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

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

在我看到的最后一个问题 here ,有人提到"semaphores are more suitable for some synchronization problems like producer-consumer".
我的 问题 例如,如果生产者线程获得了锁定并用数据填充了一些队列,而消费者同时解锁了它,那么是否存在任何并发问题?

最佳答案

我会尽我所能解决这个困惑。我将按照传统定义的方式解释这些概念。问题是人们开始混淆许多这些概念的含义,由此产生了很多混淆。

每当我们有一段代码修改了在不同进程或线程之间共享的一些内存(比如一个变量)时,我们就会得到一个 临界区 .如果我们不注意正确同步这段代码,那么我们就会得到错误。临界区的一个例子是生产者向某种共享容器添加元素。

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

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

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

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

关于concurrency - 生产者-消费者模型 - 二进制信号量还是互斥量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3993790/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com