内容简介:http://stackoverflow.com/questions/7792074/apple-docs-gcd-producer-consumer-solution-wrong
在Apple的并发编程指南中的“迁移线程”部分中,有
Changing Producer-Consumer Implementations,其声称可以使用GCD简化典型的多步pthread互斥条件变量实现.
With dispatch queues, you can simplify the producer and consumer implementations into a single call:
dispatch_async(queue, ^{ // Process a work item. });
When your producer has work to be done, all it has to do is add that work to a queue and let the queue process the item.
生产者 – 消费者问题也被称为边界缓冲区问题,但上面没有提到缓冲区,其绑定或消费者,更不用说阻止生产者和消费者.消费者为了避免上下运行.
这怎么可以成为一个有效的解决方案?
在苹果文件中所述的解决方案中:
>没有缓冲区,因为不需要缓冲区;
系统负载是有限的;
>消费者是任务.
假设您有多个生产者和消费者,生产者将数据放在共享缓冲区中,消费者从该共享缓冲区读取数据.信号量或监视器用于同步对共享缓冲区的访问,并且缓冲区大小是固定的,以便根据消耗的速率来限制正在生成的数据量,从而限制生产者.
在大中央调度下,消费者是派遣到队列的任务.由于任务是Objective-C块,生产者不需要缓冲区来告诉消费者它应该处理的数据:Objective-C块自动捕获它们引用的对象.
例如:
// Producer implementation while (…) { id dataProducedByTheProducer; // Produce data and place it in dataProducedByTheProducer dataProducedByTheProducer = …; // Dispatch a new consumer task dispatch_async(queue, ^{ // This task, which is an Objective-C block, is a consumer. // // Do something with dataProducedByTheProducer, which is // the data that would otherwise be placed in the shared // buffer of a traditional, semaphore-based producer-consumer // implementation. // // Note that an Objective-C block automatically keeps a // strong reference to any Objective-C object referenced // inside of it, and the block releases said object when // the block itself is released. NSString *s = [dataProducedByTheProducer …]; }); }
生产者可以将尽可能多的消费者任务作为可以生产的数据.但是,这并不意味着GCD将以相同的速度触发消费者的任务. GCD使用操作系统信息来控制根据当前系统负载执行的任务量.生产者本身并没有节制,在大多数情况下,它不一定是因为GCD的内在负载平衡.
如果实际上需要限制生产者,那么一个解决方案就是拥有一个能够分配n个生产者任务的主人,并让每个消费者通知主人(通过消费者完成工作之后派生的任务)已经结束,其中主人将派遣另一个生产者任务.或者,消费者本身可以在完成时分派生产者任务.
具体回答您解答的内容:
The Producer-Consumer problem is also known as the Bounded-Buffer problem, yet the above makes no mention of a buffer
不需要共享缓冲区,因为消费者是Objective-C块,它自动捕获他们引用的数据.
its bound
GCD根据当前系统负载限制已分派任务的数量.
or the consumer
消费者是派往GCD队列的任务.
let alone blocking the producer & consumer in order to avoid over/under runs
没有必要阻止,因为没有共享缓冲区.由于每个消费者都是通过Objective-C块上下文捕获机制捕获生成的数据的Objective-C块,消费者和数据之间存在一对一的关系.
http://stackoverflow.com/questions/7792074/apple-docs-gcd-producer-consumer-solution-wrong
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Kafka消费者的偏移量和高级/简单消费者
- 十一贝:航延险智能判定,公平消费环境惠及消费者
- Kafka消费者增量拉取
- Kafka分区与消费者的关系
- Kafka分区与消费者的关系
- Java精讲:生产者-消费者
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python带我起飞
李金洪 / 电子工业出版社 / 2018-6 / 79
《Python带我起飞——入门、进阶、商业实战》针对Python 3.5 以上版本,采用“理论+实践”的形式编写,通过大量的实例(共42 个),全面而深入地讲解“Python 基础语法”和“Python 项目应用”两方面内容。书中的实例具有很强的实用性,如对医疗影像数据进行分析、制作爬虫获取股票信息、自动化实例、从一组看似混乱的数据中找出规律、制作人脸识别系统等。 《Python带我起飞——......一起来看看 《Python带我起飞》 这本书的介绍吧!