IOS多线程同步问题
来源:互联网 发布:爱奇艺mac版 编辑:程序博客网 时间:2024/06/07 20:04
在多线程开发中,要注意避免的是多个线程在同一时间对某数据进行读或写所造成的不可预见错误。因此在不同线程中需要对公共数据进行互斥的访问,最常见的是生产者与消费者问题。
1. 同步块或者NSLock
同步块或者NSLock实现的效果差不多,都是进行加锁-操作-解锁,以此达到互斥访问的效果。
在一个代码块中进行加锁可以实现不同线程对该代码块的互斥访问。在多个代码块中使用同一个信号量进行加锁则不同代码块之间也能实现互斥访问。即加锁解锁的本质是对信号量的原子处理。
//生产者-同步代码块,括号参数为自定义信号量-(void)synchronizeFunc1 { @synchronized (self) { if(count < 1000) { count += 100; NSLog(@"P count is %d", count); } }}//消费者-同步代码块-(void)synchronizeFunc2 { @synchronized (self) { if(count > 0) { count -= 100; NSLog(@"C count is %d", count); } }}//生产者-NSLock,一个NSLock对象就是一个信号量-(void)synchronizeFunc3 { [nsLock lock]; if(count < 1000) { count += 100; NSLog(@"P count is %d", count); } [nsLock unlock];}//消费者-NSlock-(void)synchronizeFunc4 { [nsLock lock]; if(count > 0) { count -= 100; NSLog(@"C count is %d", count); } [nsLock unlock];}
2. NSConditon
很明显上面两种操作中,所有的线程都是独立运行的,线程之间没有任何通信或者说协作。如果消费者获得了lock,但是此时count<0,那么消费者函数将解锁并退出,也就是说取钱失败。如果我们想,取消操作中发现count<0后,可以进行等待生产者存钱,之后再取钱,这时就需要用到NSCondition了。NSCondition在NSLock的基础上,多加了wait函数和signal/broadcast函数,可以是获得了信号量但是却操作条件不足满的线程释放信号量进行等待,在条件满足之后再被唤醒继续加锁执行之前的操作。
下面有一个测试的例子看wait做了什么
//2个消费者 for(int i=0; i<2; i++){ NSThread* thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(synchronizeFunc6) object:nil]; [thread1 start]; } //1个生产者 NSThread* thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(synchronizeFunc5) object:nil]; [thread2 start];//生产者-NSConditon,一个NSConditon对象就是一个信号量-(void)synchronizeFunc5 { [condition lock]; NSLog(@"P Enter"); if(count >= 1000){ [condition wait]; NSLog(@"P wait"); } else { count += 100; NSLog(@"P count is %d", count); [condition broadcast]; } [condition unlock]; NSLog(@"P conditon");}//消费者-NSConditon-(void)synchronizeFunc6 { [condition lock]; NSLog(@"C Enter"); if(count <= 0) { [condition wait]; NSLog(@"C Wait"); } else { count -= 100; NSLog(@"C count is %d", count); [condition broadcast]; } [condition unlock]; NSLog(@"C condition");}
程序输出:
这篇博客,讲了一些property的atomic相关的东西:
点击打开链接
阅读全文
1 0
- IOS多线程同步问题
- iOS多线程相关,同步异步的问题
- IOS多线程,同步总结
- IOS多线程,同步总结
- iOS多线程同步锁
- iOS多线程同步
- iOS 多线程同步 锁
- iOS (objective-c) 中的多线程互斥同步问题
- iOS (objective-c) 中的多线程互斥同步问题
- iOS (objective-c) 中的多线程互斥同步问题
- iOS (objective-c) 中的多线程互斥同步问题
- iOS (objective-c) 中的多线程互斥同步问题
- iOS (objective-c) 中的多线程互斥同步问题2
- ios 线程同步,解决多线程修改数组等问题
- MFC多线程同步问题
- 多线程同步问题
- 多线程的同步问题
- java多线程同步问题
- POJ 1459 Power Network(最大流+EK算法邻接矩阵写法)
- cp -fr Camera /mnt/hgfs/share/cp: cannot create symbolic link '/mnt/hgfs/share/Camera/lib/arm64/libr
- phpStudy 2014的Apache虚拟主机配置
- 提交审核版本小程序-微信小程序开发-视频教程16
- 系统吞吐量(TPS)、用户并发量、性能测试概念和公式
- IOS多线程同步问题
- Android学习笔记四之Activity
- 《深入理解java虚拟机》学习-第八章-虚拟机字节码执行引擎-方法调用
- 基于配置的Spring声明式事务管理详解
- C#文件监控对象FileSystemWatcher实例,文件创建,修改,删除,重命名等
- 在wifi开启时,强制通过手机网络发送请求
- java多线程学习总结
- 数据库多个主键(联合主键)
- C++ 总结三