为什么我们在C中的Producer Consumer中使用额外的信号量


p>我有以下问题,在学习多线程时,这段代码是众所周知的生产者-消费者问题,但我不明白为什么在这种情况下我们需要额外的信号量(互斥)?难道我们不能在信号量满的情况下做每件事吗;空的,生产者当场生产,消费者还没有消费,反之亦然,就不会有任何问题了?使用互斥之后,我们在代码上添加额外的代码包,这是不必要的。有人能告诉我为什么我们需要3个信号量而不是2个吗?

我试过在我的计算机上运行这段代码,无论有没有额外的信号量,一切都一样,所以我不明白为什么作者在这个例子中选择了3个信号量?

emptyfull信号量的取值范围为[0..N),允许生产者领先消费者最多N个元素。

mutex信号量只在值0和1之间跳跃,并强制执行一个关键部分,以确保一次只有一个线程接触缓冲区内存的任何部分。然而,在每个线程上单独计算iempty/full握手确保了在buff的各个元素上不存在数据竞争,因此关键部分可能过杀。

您没有显示buff的定义。对于足够窄的数据类型(如单个字节),一些体系结构可能会在对相邻元素的并发写入时表现出字撕裂。然而,在您的示例中,只有一个线程在执行写入,因此即使在存在字撕裂的情况下,并发的相邻读取也不太可能出现问题。

最新更新