黑马程序员技术交流社区

标题: NSCondition网上的代码是否正确 [打印本页]

作者: 求学者噜噜    时间: 2015-12-5 15:58
标题: NSCondition网上的代码是否正确
RT。学IOS多线程时接触了NSCondition,学习的时候参考了网上的代码(百度搜索前10条基本都是一模一样的程序)。

后来自己研究,总感觉网上的代码不太对,故此提问,望大神解答。

参考代码出处:http://www.cnblogs.com/pengyingh/articles/2343972.html

是典型的生产者&消费者模式。

核心代码如下,生产者:
[size=1em][backcolor=rgb(245, 245, 245) !important]C/C++ code[size=1em]
[color=white !important][size=1em]?

[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em][size=1em]-(void)createProducer{
[size=1em]    [condition lock];
[size=1em]    [products addObject:[[NSObject alloc] init]];
[size=1em]    NSLog(@”produce a product”);
[size=1em]    [condition signal];
[size=1em]    [condition unlock];
[size=1em]}





消费者:
[size=1em][backcolor=rgb(245, 245, 245) !important]C/C++ code
[color=white !important][size=1em]?

[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em][size=1em]-(void)createConsumer{
[size=1em]    [condition lock];
[size=1em]    while ([products count]==0) {
[size=1em]        NSLog(@”wait for product”);
[size=1em]        [condition wait];
[size=1em]    }

[size=1em]    [products removeObjectAtIndex:0];
[size=1em]    NSLog(@”consume a product”);
[size=1em]    [condition unlock];
[size=1em]}





疑惑有:
1、生产者、消费者模式中,一般而言,生产者只有一个,消费者有多个。因此,生产者中的锁是否是多余的。
2、假定有多个生产者,则生产者使用和消费者相同的锁,是否合理。
3、消费者等待响应信号[condition wait]时,外部嵌入while循环是否冗余。
4、该while循环必定会造成该部分死循环,消费者会常挂起。这里是否是故意设计成常挂起的消费者。

作者: 求学者噜噜    时间: 2015-12-5 16:00
卧槽。好坑。代码格式全乱了。重新贴一下。
RT。学IOS多线程时接触了NSCondition,学习的时候参考了网上的代码(百度搜索前10条基本都是一模一样的程序)。

后来自己研究,总感觉网上的代码不太对,故此提问,望大神解答。

参考代码出处:http://www.cnblogs.com/pengyingh/articles/2343972.html

是典型的生产者&消费者模式。

核心代码如下,生产者:

  1. -(void)createProducer{
  2.     [condition lock];
  3.     [products addObject:[[NSObject alloc] init]];
  4.     NSLog(@”produce a product”);
  5.     [condition signal];
  6.     [condition unlock];
  7. }
复制代码


消费者:


  1. -(void)createConsumer{
  2.     [condition lock];
  3.     while ([products count]==0) {
  4.         NSLog(@”wait for product”);
  5.         [condition wait];
  6.     }

  7.     [products removeObjectAtIndex:0];
  8.     NSLog(@”consume a product”);
  9.     [condition unlock];
  10. }
复制代码


疑惑有:
1、生产者、消费者模式中,一般而言,生产者只有一个,消费者有多个。因此,生产者中的锁是否是多余的。
2、假定有多个生产者,则生产者使用和消费者相同的锁,是否合理。
3、消费者等待响应信号[condition wait]时,外部嵌入while循环是否冗余。
4、该while循环必定会造成该部分死循环,消费者会常挂起。这里是否是故意设计成常挂起的消费者。
作者: ios学者    时间: 2015-12-7 18:29
先推荐你看一下操作系统的书其中 就有生产者,消费者的,先把逻辑搞清楚,代码是次要的,会点C就可以
作者: 求学者噜噜    时间: 2015-12-9 00:50
ios学者 发表于 2015-12-7 18:29
先推荐你看一下操作系统的书其中 就有生产者,消费者的,先把逻辑搞清楚,代码是次要的,会点C就可以 ...

我是系统学过计组的,c也用了好多年了,生产者消费者也熟悉。但是学ios条件锁的时候,看的资料和我以前的知识有冲突,所以出来提问的。
作者: 求学者噜噜    时间: 2015-12-9 00:51
人工置顶
作者: 744919632    时间: 2015-12-13 00:11
额。。。表示要先看懂代码,不然都是瞎。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2