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


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

查看所有标签

猜你喜欢:

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

图解互联网金融

图解互联网金融

史册 / 化学工业出版社 / 2015-1-1 / 39.80元

《图解互联网金融》用“漫画+图解”的形式,为普通人讲述最实用的互联网金融知识。 全书从互联网金融的全景、第三方支付、P2P网贷、众筹、互联网销售平台、互联网理财、网络银行、互联网保险八个方面,全面解读了互联网金融的运营模式、发展前景和风险防控等内容。能帮助读者更好地利用互联网金融为自己创造财富。 《图解互联网金融》适合对互联网金融感兴趣的读者阅读。一起来看看 《图解互联网金融》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具