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

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

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


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

查看所有标签

猜你喜欢:

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

财富博客

财富博客

Robert Scoble、Shel Israel / 李宛蓉 / 重庆出版社 / 2008 / 38.00元

《财富博客》作者斯考伯(美国最多人阅读的企业博客作者)和谢尔•以色列(资深技术顾问)相信,博客已经开始改变企业的面貌。他们阐释说明了员工博客如何改变外界对微软的观感,敢说敢做的NBA球队老板如何运用博客和球迷连接,小企业和大公司又如何能从博客获益……另外,还有万一使用不当,博客又会招致怎样的灾难。斯考伯和以色列直言不讳,这是卓越博客的基本要件,因此他们在说完博客的好处之后,也以同样诚实的心态讨论博......一起来看看 《财富博客》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换