NSCondition网上的代码能否正确

iOS 码拜 8年前 (2016-03-30) 945次浏览
RT。学IOS多线程时接触了NSCondition,学习的时候参考了网上的代码(百度搜索前10条基本都是一模一样的程序)。
后来本人研究,总感觉网上的代码不太对,故此提问,望高手解答。
参考代码出处:http://www.cnblogs.com/pengyingh/articles/2343972.html
是典型的生产者&消费者模式。
核心代码如下,生产者:

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

消费者:

-(void)createConsumer{
    [condition lock];
    while ([products count]==0) {
        NSLog(@”wait for product”);
        [condition wait];
    }
    [products removeObjectAtIndex:0];
    NSLog(@”consume a product”);
    [condition unlock];
}

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

解决方案

40

1、生产者、消费者模式中,一般而言,生产者只有一个,消费者有多个。因此,生产者中的锁能否是多余的。
生产者和消费者都访问了products对象,所以必须对products加锁,必须是同一个锁
2、假定有多个生产者,则生产者使用和消费者相同的锁,能否合理。
见1
3、消费者等待响应信号[condition wait]时,外部嵌入while循环能否冗余。
就这个例子而言,假如其他地方 [condition signal];没有while循环,[products removeObjectAtIndex:0];就会崩溃
4、该while循环必定会造成该部分死循环,消费者会常挂起。这里能否是故意设计成常挂起的消费者。
见3

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明NSCondition网上的代码能否正确
喜欢 (0)
[1034331897@qq.com]
分享 (0)