一、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的更多相关文章

  1. NSLock/NSRecursiveLock/NSConditionLock/@synchronized

    NSLock/NSRecursiveLock/NSConditionLock/@synchronized http://blog.sina.com.cn/s/blog_8c87ba3b0101ok8y ...

  2. iOS中常见 Crash 及解决方案

    来源:枫影JustinYan 链接:http://justinyan.me/post/1609 一.访问了一个已经被释放的对象 在不使用 ARC 的时候,内存要自己管理,这时重复或过早释放都有可能导致 ...

  3. 谈谈iOS中的锁

    1 前言 近日工作不是太忙,刚好有时间了解一些其他东西,本来打算今天上午去体检,但是看看天气还是明天再去吧,也有很大一个原因:就是周六没有预约上!闲话少说,这里简单对锁来个简单介绍分享. 2 目录 第 ...

  4. iOS多线程同步锁

    在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法)会自动对参数对象加锁,保证临界区内的代码线程安全 @s ...

  5. iOS信号量的使用

    Core Audio render thread and thread signalling up vote2down votefavorite   Does iOS have any kind of ...

  6. iOS开发中多线程间关于锁的使用

    为什么需要使用锁,当然熟悉多线程的你,自然不会感到陌生. 那你在代码中是否很好的使用了锁的机制呢?你又知道几种实现锁的方法呢? main.m 1 int main(int argc, const ch ...

  7. iOS多线程编程之NSThread的使用

      目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...

  8. 【原】iOS多线程之线程间通信和线程互斥

    线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后 ...

  9. iOS多线程编程之NSThread的使用(转)

    本文由http://blog.csdn.net/totogo2010/原创 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation  ...

随机推荐

  1. JAVA上连接ubuntu14.04上的Hbase

    对于新手来说,连接虚拟机上的Hbase有点繁琐,而且网上的配置不太适合初学者,今天我就整理了一下,希望对你们有帮助,第一次发博客. 1.首先去官网下载Hbase的压缩包.我这里用的是1.2.1 htt ...

  2. 从minist database(t10k-images-idx3-ubyte)中读取图片

    matlab代码(亲测,可运行出来): % Matlab_Read_t10k-images_idx3.m % 用于读取MNIST数据集中t10k-images.idx3-ubyte文件并将其转换成bm ...

  3. Web前端优质学习网站

    * 官方:           W3C:http://www.w3.org/           ECMA:http://www.ecmascript.org/           Mozilla:h ...

  4. CentOS 6.5的安装详解

    CentOS 6.5的安装详解 主流: 目前的Linux操作系统主要应用于生产环境, 主流企业级Linux系统仍旧是RedHat或者CentOS 免费: RedHat 和CentOS差别不大,Cent ...

  5. Ubuntu火狐、Chromium等浏览器安装flash插件

    1.打开系统设置->软件和更新->其他软件,勾选Canonical合作伙伴,输入密码,重新载入更新 2.打开终端,按装插件 sudo apt install adobe-flashplug ...

  6. PortMon(电脑开放端口检查工具) 3.03 免费绿色版

    软件名称: PortMon(电脑开放端口检查工具) 3.03 免费绿色版 软件语言: 英文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP / Win2 ...

  7. 干货篇:揭开CSS盒模型神秘的面纱

    写博客可以对学习内容进行总结.分享和交流(面对面的技术分享会也不错)... 如果是单纯的记录,印象笔记完全够了. 步入正题,盒模型是web布局核心,掌握基础知识,以后实战中会如鱼得水~ 概念与历史 C ...

  8. kindeditor编辑器上传图片失败 错误 405.0解决办法(亲测)

    HTTP 错误 405.0 - Method Not Allowed(省略)editor/php/upload_json.php?dir=image物理路径 http://www.gdgoga.com ...

  9. 设置session存储在int sqlserver上---使用aspnet_regsql.exe工具

    以管理员身份打开命令窗 1)cd到相应的framework下,如:C:\Windows\Microsoft.NET\Framework\v4.0.30319 2)执行如下命令:aspnet_regsq ...

  10. 数数字(Digit Counting,ACM/ICPC Danang 2007,UVa1225)

    #include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ char s[10000]; in ...