使用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/ ...
随机推荐
- 【PHP SDK for OpenStack/Rackspace APIs】身份验证
在你使用php-opencloud之前必须先取得云服务提供商的身份验证.这是整个过程中最简单也是最让人沮丧的部分. 说它最简单是因为你只需要两部分信息: 云服务提供商的身份验证端点 用来身份验证的证书 ...
- 混淆器:java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器
java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器 下载地址:http://yunpan.cn/QXhEcGNYLgwTD 运行方式:java -jar Encryp ...
- hdu 1665 That Nice Euler Circuit(欧拉定理)
输入n个点,然后从第一个点开始,依次链接点i->点i+1,最后回到第一点(输入中的点n),求得到的图形将平面分成了多少部分. 根据欧拉定理 v_num + f_num - e_num = 2可知 ...
- 11 款最好 CSS 框架 让你的网站独领风骚
网页设计和发展领域已经成为竞争激烈的虚拟世界.想要在网络的虚拟世界中生存,仅有一堆静止的在线网络应用是远远不够的,网页必须要有很多功能,配以让人无法抗拒的设计.网页编码一定要合适.精确,才能保证不发生 ...
- C++经典笔试题及参考答案-趋势科技
1.static有什么用途?(请至少说明两种) 答案:1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数 ...
- 无锁队列--基于linuxkfifo实现
一直想写一个无锁队列,为了提高项目的背景效率. 有机会看到linux核心kfifo.h 原则. 所以这个实现自己仿照,眼下linux我们应该能够提供外部接口. #ifndef _NO_LOCK_QUE ...
- java学习笔记06--正则表达式
java学习笔记06--正则表达式 正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证.拆分.替换等操作. 例如:现在要去判断一个字符串是否由数字组成,则可以有以下的两种做法 不使用正则 ...
- ZooKeeper安装与运行
ZooKeeper安装与运行 首先从官网下载ZooKeeper压缩包,然后解压下载得到的ZooKeeper压缩包,发现有“bin,conf,lib”等目录.“bin目录”中存放有运行脚本:“conf目 ...
- STL的一些泛型算法
源地址:http://blog.csdn.net/byijie/article/details/8142859 从福州大学资料里摘下来的我现在能理解的泛型算法 algorithm min(a,b) 返 ...
- [置顶] C++学习书单
关于C++的书太多了,很容易让人没有头绪.一直想整理下,把这些书列个书单出来,直到今天才动手.希望我的经验能给后来的初学者一点帮助. 1.<C++程序设计教程> 钱能 很多学校把这本书选做 ...