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实现多线程同步的更多相关文章

  1. 起底多线程同步锁(iOS)

    iOS/MacOS为多线程.共享内存(变量)提供了多种的同步解决方案(即同步锁),对于这些方案的比较,大都讨论了锁的用法以及锁操作的开销,然后就开销表现排个序.春哥以为,最优方案的选用还是看应用场景, ...

  2. iOS:多线程同步加锁的简单介绍

    多线程同步加锁主要方式有3种:NSLock(普通锁).NSCondition(状态锁).synchronized同步代码块 还有少用的NSRecursiveLock(递归锁).NSConditionL ...

  3. c#中多线程同步Lock(锁)的研究以及跨线程UI的操作

    本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...

  4. C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent

    最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...

  5. C# 中 多线程同步退出方案 CancellationTokenSource

    C# 中提供多线程同步退出机制,详参对象: CancellationTokenSource CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用 ...

  6. Servlet基础(三) Servlet的多线程同步问题

    Servlet基础(三) Servlet的多线程同步问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率. 由于Servlet/JSP默认是以多线程模式执行的, ...

  7. Linux多线程同步方式

    当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作 ...

  8. C# 多线程同步和线程通信

    多线程通信 1. 当线程之间有先后的依赖关系时,属于线程之间的通信问题.也就是后一个线程要等待别的一个或多个线程全部完成,才能开始下一步的工作.可以使用: WaitHandle Class WaitH ...

  9. Java多线程同步问题的探究

    一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...

随机推荐

  1. C++中的对象指针

    指向对象的指针 在建立对象的时候,变异系统会给每一个对象分配一定的存储空间,以存放其成员. 对象空间的起始地址就是对象的指针.可以定义一个指针变量,用来存放对象的指针. 一个简单的示例1.1: #in ...

  2. Swift语言Auto Layout入门教程:上篇

    原文:Beginning Auto Layout Tutorial in Swift: Part 1/2,译者:@TurtleFromMars 开始用自动布局约束的方式思考吧! 更新记录:该教程由Br ...

  3. 注册Dev的帮助文件

    Download the CHM files from… Code: https://www.devexpress.com/Support/Documentation/download.xml?pla ...

  4. C#写的客户端连接 php的服务器端的小例子

    C#写的客户端连接 php的服务器端的小例子 php的server 端 <?php // server.php set_time_limit( 0 ); ob_implicit_flush(); ...

  5. Free Mind » Blog Archive » Yakuake + dtach vs Screen + urxvt

    Free Mind » Blog Archive » Yakuake + dtach vs Screen + urxvt Yakuake + dtach vs Screen + urxvt

  6. PCI 总线学习笔记

    转载请注明出处:http://blog.csdn.net/lg2lh/article/details/8042008 PCI的基本协议这里就不介绍了,由于一般的芯片协议都是集成好的,我仅仅须要大体了解 ...

  7. Android 动态生成布局 (多层嵌套)

    Android 除了能够载入xml文件,显示布局外,也能够代码生成布局,并通过setContentView(View view)方法显示布局.单独的一层布局,如一个主布局加一个控件(如Button\i ...

  8. hdu4513(manacher)

    传送门:吉哥系列故事——完美队形II 题意:求最长回文队伍且队伍由中间向两边递减. 分析:manach算法小应用,在判断回文子串向两边递减时加点限制使回文是由中间向两边递减的. #pragma com ...

  9. Java设置的读书笔记和集合框架Collection API

    一个.CollectionAPI 集合是一系列对象的聚集(Collection). 集合在程序设计中是一种重要的数据接口.Java中提供了有关集合的类库称为CollectionAPI. 集合实际上是用 ...

  10. mongodb中的排序和索引快速学习

    在mongodb中,排序和索引其实都是十分容易的,先来小结下排序: 1 先插入些数据    db.SortTest.insert( { name : "Denis", age : ...