ios – Apple doc的GCD Producer – 消费者解决方案出错?

栏目: IOS · 发布时间: 6年前

内容简介: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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python带我起飞

Python带我起飞

李金洪 / 电子工业出版社 / 2018-6 / 79

《Python带我起飞——入门、进阶、商业实战》针对Python 3.5 以上版本,采用“理论+实践”的形式编写,通过大量的实例(共42 个),全面而深入地讲解“Python 基础语法”和“Python 项目应用”两方面内容。书中的实例具有很强的实用性,如对医疗影像数据进行分析、制作爬虫获取股票信息、自动化实例、从一组看似混乱的数据中找出规律、制作人脸识别系统等。 《Python带我起飞——......一起来看看 《Python带我起飞》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具