使用NSCondition实现多线程同步
iOS中实现多线程技术有非常多方法。
这里说说使用NSCondition实现多线程同步的问题,也就是解决生产者消费者问题(如收发同步等等)。
问题流程例如以下:
消费者取得锁,取产品,假设没有,则wait,这时会释放锁,直到有线程唤醒它去消费产品;
生产者制造产品,首先也要取得锁,然后生产,再发signal,这样可唤醒wait的消费者。
这里须要注意wait和signal的问题:
1: 事实上,wait函数内部悄悄的调用了unlock函数(推測,有兴趣可自行分析),也就是说在调用wati函数后,这个NSCondition对象就处于了无锁的状态,这样其它线程就能够对此对象加锁并触发该NSCondition对象。当NSCondition被其它线程触发时,在wait函数内部得到此事件被触发的通知,然后对此事件又一次调用lock函数(推測),而在外部看起来好像接收事件的线程(调用wait的线程)从来没有放开NSCondition对象的全部权,wati线程直接由堵塞状态进入了触发状态一样。这里easy造成误解。
2: wait函数并非全然可信的。也就是说wait返回后,并不代表相应的事件一定被触发了,因此,为了保证线程之间的同步关系,使用NSCondtion时往往须要增加一个额外的变量来对非正常的wait返回进行规避。
3: 关于多个wait时的调用顺序,測试发现与wait运行顺序有关。详细请查阅文档。
前往github下载測试project:
https://github.com/zcsoft/ZCTest_NSCondtion
主要代码片段:
//
// ViewController.m
// CondtionTest
//
// Created by cuibo on 11/12/14.
// Copyright (c) 2014 cuibo. All rights reserved.
// #import "ViewController.h" @interface ViewController () @property(strong, nonatomic)NSCondition *condition;
@property(strong, nonatomic)NSMutableArray *products; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. self.products = [[NSMutableArray alloc] init];
self.condition = [[NSCondition alloc] init];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} //点一下表示開始接受
- (IBAction)test1Button:(id)sender
{
[NSThread detachNewThreadSelector:@selector(thread1) toTarget:self withObject:nil];
} //点一下表示收到一个数据
- (IBAction)test2Button:(id)sender
{
[NSThread detachNewThreadSelector:@selector(thread2) toTarget:self withObject:nil];
} //发送线程
- (void)thread1
{
while (1)
{
NSLog(@"thread1:等待发送");
[self.condition lock];
[self.condition wait]; NSLog(@"thread1:发送");
[self.condition unlock];
}
} //接收线程
- (void)thread2
{
[self.condition lock];
NSLog(@"thread2:收到数据");
[self.condition signal];
[self.condition unlock];
} @end
使用NSCondition实现多线程同步的更多相关文章
- 起底多线程同步锁(iOS)
iOS/MacOS为多线程.共享内存(变量)提供了多种的同步解决方案(即同步锁),对于这些方案的比较,大都讨论了锁的用法以及锁操作的开销,然后就开销表现排个序.春哥以为,最优方案的选用还是看应用场景, ...
- iOS:多线程同步加锁的简单介绍
多线程同步加锁主要方式有3种:NSLock(普通锁).NSCondition(状态锁).synchronized同步代码块 还有少用的NSRecursiveLock(递归锁).NSConditionL ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...
- C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent
最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...
- C# 中 多线程同步退出方案 CancellationTokenSource
C# 中提供多线程同步退出机制,详参对象: CancellationTokenSource CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用 ...
- Servlet基础(三) Servlet的多线程同步问题
Servlet基础(三) Servlet的多线程同步问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率. 由于Servlet/JSP默认是以多线程模式执行的, ...
- Linux多线程同步方式
当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作 ...
- C# 多线程同步和线程通信
多线程通信 1. 当线程之间有先后的依赖关系时,属于线程之间的通信问题.也就是后一个线程要等待别的一个或多个线程全部完成,才能开始下一步的工作.可以使用: WaitHandle Class WaitH ...
- Java多线程同步问题的探究
一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...
随机推荐
- 多校第五场 归并排序+暴力矩阵乘+模拟+java大数&记忆化递归
HDU 4911 Inversion 考点:归并排序 思路:这题呀比赛的时候忘了知道能够用归并排序算出逆序数,可是忘了归并排序的实质了.然后不会做-- 由于看到题上说是相邻的两个数才干交换的时候.感觉 ...
- gulp多张图片自动合成雪碧图
相信做前端的同学都做过这样的事情,为优化图片,减少请求会把拿到切好的图标图片,通过ps(或者其他工具)把图片合并到一张图里面,再通过css定位把对于的样式写出来引用的html里面.对于一些图片较多的项 ...
- 在Delphi中使用C++对象(两种方法,但都要改造C++提供的DLL)
Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难找到Delphi或Pascal的解决方案.可是却可能找到了一个相关的C++类.本文描述几种在Delphi代码中使 ...
- 慕尼黑大学公开课 Competitive Strategy(竞争策略)总结
第一章博弈 同时的博弈:双方同时定制策略 如果有显著的次优策略总是不如另一个,则剔除它. 如果一个策略组合中没有一方可以单独改变其策略以提高回报,则称为Nash均衡.一个游戏可能没有也可能有多个Nas ...
- C Coding Standard
1 共同 Rule 1 编译的Warnings不能被忽略掉 Rule 2 在已有Code或者三方的code基础上的改动,同意使用原来的coding standard Rule 3 假设同意C和C++都 ...
- Activity与Service通信的方式有三种:
在博客园看到的,看着挺不错的,借来分享下 继承Binder类 这个方式仅仅有当你的Acitivity和Service处于同一个Application和进程时,才干够用,比方你后台有一个播放背景音乐的S ...
- WeText项目的服务端
WeText项目的服务端 在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 wi ...
- hdu4635(强连通缩点)
传送门:Strongly connected 题意:求最多可以加多少边,使得最新的图还不是强连通图. 分析:最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数 ...
- 网页favicon.ico图标设置(转)
随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,这个图标是:,也就是我们常说的favicon.ico. 由于这篇文章主要讨论favico ...
- set echo on/off,set term on/off,set feedback off,set heading off命令(转)
1.term命令: 当和SPOOL命令联合使用时,可以取消SQLPLUS输出,查询结果仅仅存在于假脱机文件中 set term on:查询结果既显示于假脱机文件中,又在SQLPLUS中显示: s ...