NSCondition
一、NSCondition是对条件变量和互斥量的一个封装,用于线程之间的同步。
其中的互斥量用于保护对条件变量的修改,条件变量变化以信号量的方式通知其它线程实现线程之间的同步。
二、NSCondition的API
NSCondition实现了NSLocking协议,这个协议定义了lock和unlock方法,用于多个线程互斥得执行一段代码,以保护共享的数据。
同时,NSCondition还包含以下方法:
- (void)wait;
- (BOOL)waitUntilDate:(NSDate *)limit;
- (void)signal;
- (void)broadcast;
wait:释放互斥量,使当前线程等待,切换到其它线程执行。
waitUntilDate:释放互斥量,使当前线程等待到某一个时间,切换到其它线程执行。
signal:唤醒一个其它等待该条件变量的线程
broadcast:唤醒所有其它等待该条件变量的线程
三、demo
下面的例子来源于网络,对其做了一点修改
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSConditionSample *sample = [[NSConditionSample alloc] init];
[NSThread detachNewThreadSelector:@selector(createConsumenr)
toTarget:sample
withObject:nil];
[NSThread detachNewThreadSelector:@selector(createProducter)
toTarget:sample
withObject:nil];
getchar();
}
return ;
}
下面是生产者、消费者:
#import "NSConditionSample.h" @interface NSConditionSample ()
{
NSCondition *condition;
NSMutableArray *products;
} @end @implementation NSConditionSample - (instancetype)init
{
if(self = [super init])
{
condition = [[NSCondition alloc] init];
products = [[NSMutableArray alloc] init];
}
return self;
} - (void)createConsumenr
{
while (YES) {
NSLog(@"createConsumenr before lock");
[condition lock];
NSLog(@"createConsumenr after lock");
while ([products count] == ) {
NSLog(@"wait for products");
[condition wait];
}
[products removeObjectAtIndex:];
NSLog(@"comsume a product");
[condition unlock];
}
} - (void)createProducter
{
while (YES) {
NSLog(@"createProducter before lock");
[condition lock];
NSLog(@"createProducter after lock");
[products addObject:[[NSObject alloc] init]];
NSLog(@"produce a product");
[condition signal];
[condition unlock];
} } @end
执行的log:
2015-07-24 11:05:48.374 NSConditionSample[45259:40628634] createConsumenr before lock
2015-07-24 11:05:48.374 NSConditionSample[45259:40628635] createProducter before lock
2015-07-24 11:05:48.374 NSConditionSample[45259:40628634] createConsumenr after lock
2015-07-24 11:05:48.375 NSConditionSample[45259:40628634] wait for products
2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] createProducter after lock
2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] produce a product
2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] createProducter before lock
2015-07-24 11:05:48.375 NSConditionSample[45259:40628634] comsume a product
2015-07-24 11:05:48.375 NSConditionSample[45259:40628634] createConsumenr before lock
2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] createProducter after lock
2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] produce a product
2015-07-24 11:05:48.375 NSConditionSample[45259:40628634] createConsumenr after lock
2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] createProducter before lock
2015-07-24 11:05:48.375 NSConditionSample[45259:40628634] comsume a product
2015-07-24 11:05:48.376 NSConditionSample[45259:40628634] createConsumenr before lock
2015-07-24 11:05:48.376 NSConditionSample[45259:40628635] createProducter after lock
2015-07-24 11:05:48.376 NSConditionSample[45259:40628635] produce a product
2015-07-24 11:05:48.376 NSConditionSample[45259:40628634] createConsumenr after lock
2015-07-24 11:05:48.376 NSConditionSample[45259:40628635] createProducter before lock
2015-07-24 11:05:48.376 NSConditionSample[45259:40628634] comsume a product
2015-07-24 11:05:48.390 NSConditionSample[45259:40628634] createConsumenr before lock
2015-07-24 11:05:48.390 NSConditionSample[45259:40628635] createProducter after lock
2015-07-24 11:05:48.390 NSConditionSample[45259:40628635] produce a product
NSCondition的更多相关文章
- NSCondition的用法,NSCondication实现线程同步,生产者消费问题实现(转载)
NSCondition的用法 使用NSCondition,实现多线程的同步,即,可实现生产者消费者问题. 基本思路是,首先要创建公用的NSCondition实例.然后: 消费者取得锁,取产品,如果没有 ...
- 使用NSCondition实现多线程同步
iOS中实现多线程技术有非常多方法. 这里说说使用NSCondition实现多线程同步的问题,也就是解决生产者消费者问题(如收发同步等等). 问题流程例如以下: 消费者取得锁,取产品,假设没有,则wa ...
- NSCondition用法
NSCondition用法 使用NSCondition,实现多线程同步...举个列子 消费者跟生产者... 现在传言6s要出了.. 消费者想买6s.现在还没有6s.消费者等待6s生产. 生产了一个产品 ...
- iOS线程之——NSCondition
多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美.这篇文章主要从线程创建与启动.线程的同步与锁.线程的交互.线 ...
- NSCondition(转)
NSConditionLock 继承类NSObject 遵从的协议NSLocking NSObject NSConditionLock 类定义特定的.用户定义的条件锁 协议NSLocking 方法 l ...
- 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
- iOS开发系列--并行开发其实很容易
--多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...
- iOS-多线程基础
进程与线程: 1> 一个应用程序对应一个进程,一个进程帮助程序占据一块存储空间 2> 要想在进程中执行任务,就必须开启线程,一条线程就代表一个任务 3> 一个进程中允许开 ...
- 谈谈iOS中的锁
1 前言 近日工作不是太忙,刚好有时间了解一些其他东西,本来打算今天上午去体检,但是看看天气还是明天再去吧,也有很大一个原因:就是周六没有预约上!闲话少说,这里简单对锁来个简单介绍分享. 2 目录 第 ...
随机推荐
- C语言编程小tip
1. 随机数产生 int rand(void)产生的随机数每次运行时都是与上一次相同,若要不同,用函数srand()初始化之. void srand(unsigned int seed)初始化随机数发 ...
- TypeScript -- 面向对象特性
.class关键字和类名就可以定义一个类 . 类的访问控制符--有三个,.] = ] = ] = ;.声明参数 .用接口声明方法 .理解模块--一个文件就是一个模块,就是这么个意思 ,不用想的多么高大 ...
- 《C++反汇编与逆向分析技术揭秘》——观察各种表达式的求值过程
---恢复内容开始--- 加法: 示例: 常量相加,则在编译期间就计算出两个常量相加后的结果,直接将这个结果参与运算,减少了运行期的计算.当有变量参与运算时,会先取出内存中的数据,放入通用寄存器中,再 ...
- Python学习笔记——基础篇【第五周】——常用模块学习
模块介绍 本节大纲: 模块介绍 time &datetime模块 (时间模块) random (随机数模块) os (系统交互模块) sys shutil (文件拷贝模块) j ...
- MVC网站后台分离
1.新建一个项目TestAdmin项目类型随便选一个,待会删掉,因为这里我只需要解决方案名称 [项目存放于F盘 F:\TestAdmin] 2.新建一个 ZGJ.Web 的前台MVC项目,将开 ...
- 基于Java 的增量与完全备份小工具
前段时间,因为各种原因,自己动手写了一个小的备份工具,用了一个星期,想想把它的设计思路放上来,当是笔记吧. 需求场景:这个工具起初的目的是为了解决朋友公司对其网络的限制(不可以用任何同步软件,git, ...
- 清理SharePoint 2010的SQL Server 2008 R2日志数据库的方法!
//来源:http://www.cnblogs.com/nbpowerboy/p/3380079.html 公司用SharePoint 2010已有三年多的时间了,上BPM项目也有2年多的时间,之前供 ...
- jquery中get传输方法实现读取xml文件
xml文件: <?xml version="1.0" encoding="gb2312"?> <china> <province ...
- 【小技巧】C#的saveFileDialog和openFileDialog的用法总结
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- uiwebview 加载html时字体变小 加载前或加载后改变字体大小
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae } p.p2 { margin: 0.0px 0. ...