iOS 生产者消费者
2016-07-18 13:41
435 查看
在编码中,有时会遇到一个模块产生数据,另外一个模块处理数据的情况,不论是为了模块间的结偶或是并发处理还是忙闲不均,我们都会在产生和处理数据的模块之间放置缓存区,作为生产和处理数据的仓库。以上的模型就是生产者消费者模型。
为了简化上述模型,生产者和消费者只用一个线程替代,缓存区用数组表示。
我们知道,多个线程数据进行读写,要对这个共享数据进行读写保护,也就是线程的同步。在ios中,我们可以通过加锁(NSlock)、同步块@synchronized及NSCondition等对共享资源进行保护。
1、//消费者(NSLock)
- (void)createSaller {
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
dispatch_async(queue, ^{
while (1) {
[_lock lock];
if (_array.count) {
[_array
removeObjectAtIndex:0];
NSLog(@"sall a good:%lu", (unsigned
long)_array.count);
}
[_lock unlock];
}
});
}
//生产者(NSLock)
- (void)createProductor {
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
dispatch_async(queue, ^{
while (1) {
[_lock
lock];
if (_array.count ==
0) {
[_array
addObject:@""];
NSLog(@"create a good:%lu", (unsigned
long)_array.count);
}
[_lock unlock];
}
});
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2、同步块@synchronized,只需要把lock和unlock间的代码放大同步块之间即可
@synchronized(self) {
if (_array.count) {
[_array
removeObjectAtIndex:0];
NSLog(@"sall a good:%lu", (unsigned
long)_array.count);
}
}
3、NSCondition在同步在的应用跟lock是一样的
[_condition
lock];
if (_array.count) {
[_array
removeObjectAtIndex:0];
NSLog(@"sall a good:%lu", (unsigned
long)_array.count);
}
}
[_condition
unlock];
NSlock和NScondition的区别:
NSCondition除了当做锁之外,还能处理线程之间的调度。
我们知道,线程的调度是操作系统的事,对我们是透明的,但是某些时候我们想自己控制线程的调度,那NSCondition就派上用场了。
比如上面的生产者消费者代码:缓存区(_array)是空的时候,消费者线程就休眠,生产者生产出产品之后,唤醒消费者线程消费产品。
这时NScondition就派上用场了:
- (void)createSaller {
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
dispatch_async(queue, ^{
while (1) {
[_condition
lock];
if (_array.count) {
[_array
removeObjectAtIndex:0];
NSLog(@"sall a good:%lu", (unsigned
long)_array.count);
}
else {
[_condition
wait];
}
[_condition unlock];
}
});
}
- (void)createProductor {
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
dispatch_async(queue, ^{
while (1) {
[_condition
lock];
if (_array.count ==
0) {
[_array
addObject:@""];
NSLog(@"create a good:%lu", (unsigned
long)_array.count);
}
else {
[_condition
signal];
}
[_condition unlock];
}
});
}
体外:
NSCondition可以实现NSlock的所有功能,那为什么还需要NSlock,其实这个跟BOOL和NSINteger的道理是一样的,NSINteger完全可以替代BOOL的功能,但是BOOL在某些时候看起来更接近人的表达或者说是思维。
为了简化上述模型,生产者和消费者只用一个线程替代,缓存区用数组表示。
我们知道,多个线程数据进行读写,要对这个共享数据进行读写保护,也就是线程的同步。在ios中,我们可以通过加锁(NSlock)、同步块@synchronized及NSCondition等对共享资源进行保护。
1、//消费者(NSLock)
- (void)createSaller {
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
dispatch_async(queue, ^{
while (1) {
[_lock lock];
if (_array.count) {
[_array
removeObjectAtIndex:0];
NSLog(@"sall a good:%lu", (unsigned
long)_array.count);
}
[_lock unlock];
}
});
}
//生产者(NSLock)
- (void)createProductor {
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
dispatch_async(queue, ^{
while (1) {
[_lock
lock];
if (_array.count ==
0) {
[_array
addObject:@""];
NSLog(@"create a good:%lu", (unsigned
long)_array.count);
}
[_lock unlock];
}
});
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2、同步块@synchronized,只需要把lock和unlock间的代码放大同步块之间即可
@synchronized(self) {
if (_array.count) {
[_array
removeObjectAtIndex:0];
NSLog(@"sall a good:%lu", (unsigned
long)_array.count);
}
}
3、NSCondition在同步在的应用跟lock是一样的
[_condition
lock];
if (_array.count) {
[_array
removeObjectAtIndex:0];
NSLog(@"sall a good:%lu", (unsigned
long)_array.count);
}
}
[_condition
unlock];
NSlock和NScondition的区别:
NSCondition除了当做锁之外,还能处理线程之间的调度。
我们知道,线程的调度是操作系统的事,对我们是透明的,但是某些时候我们想自己控制线程的调度,那NSCondition就派上用场了。
比如上面的生产者消费者代码:缓存区(_array)是空的时候,消费者线程就休眠,生产者生产出产品之后,唤醒消费者线程消费产品。
这时NScondition就派上用场了:
- (void)createSaller {
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
dispatch_async(queue, ^{
while (1) {
[_condition
lock];
if (_array.count) {
[_array
removeObjectAtIndex:0];
NSLog(@"sall a good:%lu", (unsigned
long)_array.count);
}
else {
[_condition
wait];
}
[_condition unlock];
}
});
}
- (void)createProductor {
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
dispatch_async(queue, ^{
while (1) {
[_condition
lock];
if (_array.count ==
0) {
[_array
addObject:@""];
NSLog(@"create a good:%lu", (unsigned
long)_array.count);
}
else {
[_condition
signal];
}
[_condition unlock];
}
});
}
体外:
NSCondition可以实现NSlock的所有功能,那为什么还需要NSlock,其实这个跟BOOL和NSINteger的道理是一样的,NSINteger完全可以替代BOOL的功能,但是BOOL在某些时候看起来更接近人的表达或者说是思维。
相关文章推荐
- iOS 真机模拟的报错(第一篇博客 测试用)
- iOS-OC-DrawRect使用小谈
- 【幻灯片分享】揭开IPA文件的灰沙 -- 通过静态分析工具了解IPA实现 | 友盟 张超 | iOS DevCamp
- iOS唯一标示符引导
- iOS9关键字的简单使用
- iOS9关键字的简单使用
- iOS怎样画出图片的一部分
- 改变image的尺寸大小,按原比例不拉伸。
- iOS开发-打包更新版本
- 真机测试的时候出现 data parameter is nil
- iOS自定义相机
- ios中几种跳转方式,普通,和StoryBoard跳转
- iOS字符串反转
- iOS-上传 包的时候 提示 Redundant binary upload
- iOS 图标适配官网
- CocoaPods详解——安装和使用以及可能遇到的错误
- iOS 下关于 MD5 的那个坑
- [绍棠] ios9的设备为什么会收到了两条重复的推送
- iOS学习之Socket使用简明教程- AsyncSocket
- iOS 不同系统横竖屏转动