使用NSCondition实现多线程同步
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实现多线程同步的更多相关文章
- 起底多线程同步锁(iOS)
iOS/MacOS为多线程.共享内存(变量)提供了多种的同步解决方案(即同步锁),对于这些方案的比较,大都讨论了锁的用法以及锁操作的开销,然后就开销表现排个序.春哥以为,最优方案的选用还是看应用场景, ...
- iOS:多线程同步加锁的简单介绍
多线程同步加锁主要方式有3种:NSLock(普通锁).NSCondition(状态锁).synchronized同步代码块 还有少用的NSRecursiveLock(递归锁).NSConditionL ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...
- C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent
最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...
- C# 中 多线程同步退出方案 CancellationTokenSource
C# 中提供多线程同步退出机制,详参对象: CancellationTokenSource CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用 ...
- Servlet基础(三) Servlet的多线程同步问题
Servlet基础(三) Servlet的多线程同步问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率. 由于Servlet/JSP默认是以多线程模式执行的, ...
- Linux多线程同步方式
当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作 ...
- C# 多线程同步和线程通信
多线程通信 1. 当线程之间有先后的依赖关系时,属于线程之间的通信问题.也就是后一个线程要等待别的一个或多个线程全部完成,才能开始下一步的工作.可以使用: WaitHandle Class WaitH ...
- Java多线程同步问题的探究
一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...
随机推荐
- html中加入超链接方式的汇总
在CSS样式中,对超链接的样式有以下几种定义(1)设置链接未被访问时的样式,具体写法如下:a:link{font-size:10px;... }(2)设置链接在鼠标经过时的样式,具体写法如下:a:ho ...
- Android Studio之同一窗口打开项目
Android Studio默认新打开的项目都是重新打开一个窗口,和原项目窗口同时存在,如果打开多个项目,则有很多窗口同时打开,怎么根据需要决定自己以何种方式打开呢? 1.设置打开新项目的方式 第一项 ...
- QTableView 固定列宽度(鼠标拖动后,仍可固定)
QTableView 提供一个函数: void QTableView::setColumnWidth ( int column, int width ) 用于设置column指定的列的宽度 但setC ...
- iOS中的字符串NSString
创建一个字符串对象: NSstring * str1 = @"hello world"; NSString * str = [[NSString alloc]initWithStr ...
- 极路由1s,固件需要刷入RipOS系统的加40块
极路由1s,固件需要刷入RipOS系统的加40块,集成wifidog功能,wifi广告路由器的理想选择功能. 经过测试,无线性能稳定,无线可带32个手机客户端. 具体配置: 7620CPU ,主频58 ...
- Leetcode_num13_Climbing Stairs
称号: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...
- Amazon.com : The Odyssey of the Manual Toothbrusher
Amazon.com : The Odyssey of the Manual Toothbrusher The Odyssey of the Manual Toothbrusher
- adm下载器
netdisk;5.2.7;PC;PC-Windows;6.2.9200;WindowsBaiduYunGuanJia
- [置顶] Firefox OS 学习——manifest.webapp结构分析
在Firefox OS 学习——Gaia 编译分析 这篇文章多次提到manifest.webapp文件,对于做过android app 开发的人来说,都很熟悉Android.mk 和Manifest ...
- Android SDK r23
SDK Tools Only Platform Package Size MD5 Checksum Windows 32 & 64-bit android-sdk_r23-windows.zi ...