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

  1. NSCondition的用法,NSCondication实现线程同步,生产者消费问题实现(转载)

    NSCondition的用法 使用NSCondition,实现多线程的同步,即,可实现生产者消费者问题. 基本思路是,首先要创建公用的NSCondition实例.然后: 消费者取得锁,取产品,如果没有 ...

  2. 使用NSCondition实现多线程同步

    iOS中实现多线程技术有非常多方法. 这里说说使用NSCondition实现多线程同步的问题,也就是解决生产者消费者问题(如收发同步等等). 问题流程例如以下: 消费者取得锁,取产品,假设没有,则wa ...

  3. NSCondition用法

    NSCondition用法 使用NSCondition,实现多线程同步...举个列子 消费者跟生产者... 现在传言6s要出了.. 消费者想买6s.现在还没有6s.消费者等待6s生产. 生产了一个产品 ...

  4. iOS线程之——NSCondition

    多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美.这篇文章主要从线程创建与启动.线程的同步与锁.线程的交互.线 ...

  5. NSCondition(转)

    NSConditionLock 继承类NSObject 遵从的协议NSLocking NSObject NSConditionLock 类定义特定的.用户定义的条件锁 协议NSLocking 方法 l ...

  6. 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!

    多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...

  7. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

  8. iOS-多线程基础

    进程与线程: 1>   一个应用程序对应一个进程,一个进程帮助程序占据一块存储空间 2>   要想在进程中执行任务,就必须开启线程,一条线程就代表一个任务 3>   一个进程中允许开 ...

  9. 谈谈iOS中的锁

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

随机推荐

  1. hdu 5833 Zhu and 772002 异或方程组高斯消元

    ccpc网赛卡住的一道题 蓝书上的原题 但是当时没看过蓝书 今天又找出来看看 其实也不是特别懂 但比以前是了解了一点了 主要还是要想到构造异或方程组 异或方程组的消元只需要xor就好搞了 数学真的是硬 ...

  2. ios在项目中打开word文档、ppt等总结

    最近在项目开发中遇到下载附件文档预览需求,在这里总结一下我的实现方法,本文最后会附带我写的demo下载地址 这里我总结了三种实现方法(1)用webView预览(2)通过UIDocumentIntera ...

  3. linux 安装php的redis拓展

    安装步骤: #wget  https://github.com/nicolasff/phpredis/archive/2.2.4.tar.gz #tar -zxvf 2.2.4 #cd phpredi ...

  4. CodeForces 707A Brain's Photos

    简单题. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #inclu ...

  5. SpringMVC同时使用<mvc:resources … />和日期转换Formatter时出现问题的解决方法

    很久没更新博文了,不是没有学习,而是很多东西记在OneNote里面,收获很多啊,因为各种杂事,所以对于博客很久没更新了. 个人觉得:博客比起OneNote或者为知笔记之类的云笔不同在于博客应该记载的是 ...

  6. ubuntu14通过trove/redstack安装openstack环境

    ---恢复内容开始--- Trove Installation Trove is constantly under development. The easiest way to install Tr ...

  7. 安装配置Postgresql

    //关闭selinuxgetenforcesetenfroce 0vi /etc/selinux/configSELINUX=disabledSELINUXTYPE=targeted//关闭防火墙#c ...

  8. 8.MyBatos的动态Sql

    1.创建javaWeb项目MyBatis_dynamicSQL并在WebRoot下的WEB-INF下的lib下添加如下jar文件 cglib-nodep-2.1_3.jar log4j-1.2.17. ...

  9. [河南省ACM省赛-第三届] BUYING FEED (nyoj 248)

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> us ...

  10. Mac最好的虚拟机软件Parallels,体验比Vmware棒

    每一位Mac电脑用户,必须安装虚拟机软件,在虚拟机里面安装Windows系统,解决日常必须用windows软件的问题,解决国内网银登录的兼容问题. 你一定不要用Mac系统自带的boot camp方式安 ...