NSConditionLock
一、NSConditionLock定义了一个可以指定条件的互斥锁,用于线程之间的互斥与同步。
这里的条件并不是bool表达式中的条件,而是一个特定的int值。
二、NSConditionLock的API
NSConditionLock实现了NSLocking协议,有lock和unlock方法。
NSConditionLock具有以下方法:
- (void)lockWhenCondition:(NSInteger)condition; - (BOOL)tryLock; - (BOOL)tryLockWhenCondition:(NSInteger)condition; - (void)unlockWithCondition:(NSInteger)condition; - (BOOL)lockBeforeDate:(NSDate *)limit; - (BOOL)lockWhenCondition:(NSInteger)condition beforeDate:(NSDate *)limit;
lockWhenCondition :用于condition等于特定值的时候加锁,会阻塞当前线程。
tryLock,tryLockWhenCondition :尝试加锁,加锁失败时返回NO,try开头的方法会理解解锁。
lockBeforeDate,lockWhenCondition:指定条件加锁,会阻塞当前线程。
unlockWithCondition:指定条件时解锁,每次解锁会导致内部的condition值改变为指定的值,同时唤醒其它阻塞的线程检测这里的condition是否满足条件,因此NSConditionLock相对于NSCondition效率更低。
三、demo
接上一节中的main方法,修改NSConditionSample:
@interface NSConditionSample ()
{
NSConditionLock *conditionLock;
NSMutableArray *products;
} @end @implementation NSConditionSample - (instancetype)init
{
if(self = [super init])
{
conditionLock = [[NSConditionLock alloc] initWithCondition:0];
products = [[NSMutableArray alloc] init];
}
return self;
} - (void)createConsumenr
{
while (YES) {
NSLog(@"createConsumenr before lock");
[conditionLock lockWhenCondition:10];
NSLog(@"createConsumenr after lock");
if([products count] > 0)
[products removeObjectAtIndex:0];
NSLog(@"comsume a product,left %d products",[products count]);
[conditionLock unlockWithCondition:[products count]==0?0:10];
}
} - (void)createProducter
{
while (YES) {
NSLog(@"createProducter before lock");
[conditionLock lock];
NSLog(@"createProducter after lock");
[products addObject:[[NSObject alloc] init]];
NSLog(@"produce a product,left %d products",[products count]);
[conditionLock unlockWithCondition:[products count]];
} } @end
执行结果:
2015-07-24 13:06:31.323 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.323 NSConditionSample[47237:41183763] createConsumenr before lock
2015-07-24 13:06:31.323 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.323 NSConditionSample[47237:41183762] produce a product,left 1 products
2015-07-24 13:06:31.324 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.324 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.324 NSConditionSample[47237:41183762] produce a product,left 2 products
2015-07-24 13:06:31.324 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.324 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.324 NSConditionSample[47237:41183762] produce a product,left 3 products
2015-07-24 13:06:31.324 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.324 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.324 NSConditionSample[47237:41183762] produce a product,left 4 products
2015-07-24 13:06:31.324 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.324 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.325 NSConditionSample[47237:41183762] produce a product,left 5 products
2015-07-24 13:06:31.336 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.336 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.336 NSConditionSample[47237:41183762] produce a product,left 6 products
2015-07-24 13:06:31.336 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.336 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.336 NSConditionSample[47237:41183762] produce a product,left 7 products
2015-07-24 13:06:31.336 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.336 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.336 NSConditionSample[47237:41183762] produce a product,left 8 products
2015-07-24 13:06:31.336 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.337 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.337 NSConditionSample[47237:41183762] produce a product,left 9 products
2015-07-24 13:06:31.337 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.337 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.337 NSConditionSample[47237:41183762] produce a product,left 10 products
2015-07-24 13:06:31.337 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.337 NSConditionSample[47237:41183763] createConsumenr after lock
2015-07-24 13:06:31.337 NSConditionSample[47237:41183763] comsume a product,left 9 products
2015-07-24 13:06:31.337 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.337 NSConditionSample[47237:41183763] createConsumenr before lock
2015-07-24 13:06:31.337 NSConditionSample[47237:41183762] produce a product,left 10 products
2015-07-24 13:06:31.338 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.338 NSConditionSample[47237:41183763] createConsumenr after lock
2015-07-24 13:06:31.338 NSConditionSample[47237:41183763] comsume a product,left 9 products
2015-07-24 13:06:31.338 NSConditionSample[47237:41183763] createConsumenr before lock
2015-07-24 13:06:31.338 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.338 NSConditionSample[47237:41183762] produce a product,left 10 products
2015-07-24 13:06:31.338 NSConditionSample[47237:41183763] createConsumenr after lock
2015-07-24 13:06:31.338 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.338 NSConditionSample[47237:41183763] comsume a product,left 9 products
2015-07-24 13:06:31.338 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.338 NSConditionSample[47237:41183763] createConsumenr before lock
2015-07-24 13:06:31.338 NSConditionSample[47237:41183762] produce a product,left 10 products
2015-07-24 13:06:31.338 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.338 NSConditionSample[47237:41183763] createConsumenr after lock
2015-07-24 13:06:31.339 NSConditionSample[47237:41183763] comsume a product,left 9 products
2015-07-24 13:06:31.339 NSConditionSample[47237:41183763] createConsumenr before lock
2015-07-24 13:06:31.339 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.339 NSConditionSample[47237:41183762] produce a product,left 10 products
2015-07-24 13:06:31.339 NSConditionSample[47237:41183763] createConsumenr after lock
2015-07-24 13:06:31.339 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.339 NSConditionSample[47237:41183763] comsume a product,left 9 products
2015-07-24 13:06:31.339 NSConditionSample[47237:41183763] createConsumenr before lock
2015-07-24 13:06:31.339 NSConditionSample[47237:41183762] createProducter after lock
2015-07-24 13:06:31.339 NSConditionSample[47237:41183762] produce a product,left 10 products
2015-07-24 13:06:31.339 NSConditionSample[47237:41183762] createProducter before lock
2015-07-24 13:06:31.339 NSConditionSample[47237:41183763] createConsumenr after lock
NSConditionLock的更多相关文章
- NSLock/NSRecursiveLock/NSConditionLock/@synchronized
NSLock/NSRecursiveLock/NSConditionLock/@synchronized http://blog.sina.com.cn/s/blog_8c87ba3b0101ok8y ...
- iOS中常见 Crash 及解决方案
来源:枫影JustinYan 链接:http://justinyan.me/post/1609 一.访问了一个已经被释放的对象 在不使用 ARC 的时候,内存要自己管理,这时重复或过早释放都有可能导致 ...
- 谈谈iOS中的锁
1 前言 近日工作不是太忙,刚好有时间了解一些其他东西,本来打算今天上午去体检,但是看看天气还是明天再去吧,也有很大一个原因:就是周六没有预约上!闲话少说,这里简单对锁来个简单介绍分享. 2 目录 第 ...
- iOS多线程同步锁
在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法)会自动对参数对象加锁,保证临界区内的代码线程安全 @s ...
- iOS信号量的使用
Core Audio render thread and thread signalling up vote2down votefavorite Does iOS have any kind of ...
- iOS开发中多线程间关于锁的使用
为什么需要使用锁,当然熟悉多线程的你,自然不会感到陌生. 那你在代码中是否很好的使用了锁的机制呢?你又知道几种实现锁的方法呢? main.m 1 int main(int argc, const ch ...
- iOS多线程编程之NSThread的使用
目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...
- 【原】iOS多线程之线程间通信和线程互斥
线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后 ...
- iOS多线程编程之NSThread的使用(转)
本文由http://blog.csdn.net/totogo2010/原创 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation ...
随机推荐
- linux 查看磁盘占用情况
查看"/usr/local/"路径下,所有文件大小总和.只列出总和,不显示该路径下各子文件的大小. du -sh /usr/local/ 结果显示如下图: 如果要详细显示出各子文件 ...
- InnoDB与MyISAM引擎区别
mysql中InnoDB与MyISAM两种数据库引擎的区别: 一.InnoDB引擎: 1.支持事务性, 2.支持外部键, 3.行级锁, 4.不保存表的具体行数,执行select count(*) fr ...
- 转载:c# string.Format
C#:STRING.FORMAT数字格式化输出 1.各种常用数字格式化 货币转换 C 或 c(默认小数点后2位.C3后面跟的数字就代表小数后几位) string.Format("{0: ...
- get请求与post请求之间的差异
GET:常用于向服务器请求查询某些信息 get请求适用于当URL完全指定请求资源. get请求不会对数据库进行任何操作相当于数据库的查询. 当进行字段查询时可将查询字段增加到url的末尾. get请 ...
- StringBuilder跟StringBuffer
一直以来只知道StringBuffer是线程安全的,StringBuilder是线程不安全的, 所以通常情况下使用StringBuilder,这样可以提升效率!!! 今天由于想起StringBuild ...
- [SOJ] DAG?
Description 输入一个有向图,判断该图是否是有向无环图(Directed Acyclic Graph). Input 输入的第一行包含两个整数n和m,n是图的顶点数,m是边数.1<=n ...
- Openwrt 初始化脚本
Openwrt 使用自己的初始化脚本系统,所有的初始化脚本位于 /etc/init.d 目录下. 任何一个初始化脚本必须包含基本的 start() 和 stop() 函数.当系统启动或用户拉起对应的进 ...
- ansible Strategies
Strategies 控制task的执行方式, 在2.0中增加了"free" Strategies, 可以允许每个host尽快的执行完一个play. 默认是Strategies是l ...
- Centos6.5环境中安装vsftp服务
1.检查vsftp是否安装 命令:rpm -qa|grep vsftpd 若已经安装,则显示相关的版本信息,否则什么也没有. 也可以输入find -name "vsftpd" -p ...
- Font-Awesome IIS下不显示问题
解决方法: 在IIS设置中添加一个IMME fileExtension: .woff mimeType:application/x-font-woff