object-c 多线程 加锁

object-c的多线程如java的多线程一样方便可靠。

一、线程创建与启动
线程创建主要有二种方式:
[cpp] view plaincopy

- (id)init; // designated initializer
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

当然,还有一种比较特殊,就是使用所谓的convenient method,这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责。这个方法的接口是:
[cpp]  view plain copy

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

前两种方法创建后,需要手机启动,启动的方法是:
[cpp]  view plain copy

- (void)start;

二、线程的同步与锁
要说明线程的同步与锁,最好的例子可能就是多个窗口同时售票的售票系统了。我们知道在java中,使用synchronized来同步,而iphone虽然没有提供类似java下的synchronized关键字,但提供了NSCondition对象接口。查看NSCondition的接口说明可以看出,NSCondition是iphone下的锁对象,所以我们可以使用NSCondition实现iphone中的线程安全。这是来源于网上的一个例子:

SellTicketsAppDelegate.h 文件
[cpp]  view plain copy

// SellTicketsAppDelegate.h
import
@interface SellTicketsAppDelegate : NSObject {
int tickets;
int count;
NSThread* ticketsThreadone;
NSThread* ticketsThreadtwo;
NSCondition* ticketsCondition;
UIWindow *window;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end

SellTicketsAppDelegate.m 文件
[cpp]   view plain copy

// SellTicketsAppDelegate.m
import “SellTicketsAppDelegate.h”
@implementation SellTicketsAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {

tickets = 100;
count = 0;
// 锁对象
ticketCondition = [[NSCondition alloc] init];
ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadone setName:@"Thread-1"];
[ticketsThreadone start];
ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadtwo setName:@"Thread-2"];
[ticketsThreadtwo start];
//[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
// Override point for customization after application launch
[window makeKeyAndVisible];
}
- (void)run{
while (TRUE) {
// 上锁
[ticketsCondition lock];
if(tickets > 0){
[NSThread sleepForTimeInterval:0.5];
count = 100 – tickets;
NSLog(@”当前票数是:%d,售出:%d,线程名:%@”,tickets,count,[[NSThread currentThread] name]);
tickets–;
}else{
break;
}
[ticketsCondition unlock];
}
}
- (void)dealloc {
[ticketsThreadone release];
[ticketsThreadtwo release];
[ticketsCondition release];
[window release];
[super dealloc];
}
@end

三、线程的交互
线程在运行过程中,可能需要与其它线程进行通信,如在主线程中修改界面等等,可以使用如下接口:
[cpp]  view plain copy

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

由于在本过程中,可能需要释放一些资源,则需要使用NSAutoreleasePool来进行管理,如:
[cpp]  view plain copy

- (void)startTheBackgroundJob {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// to do something in your thread job

[self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO];
[pool release];
}

转自iOS分享网  http://iosshare.cn

时间: 2024-10-26 02:11:54

object-c 多线程 加锁的相关文章

java-并发-ConcurrentHashMap高并发机制-jdk1.6

ConcurrentHashMap 是 util.concurrent 包的重要成员.本文将结合 Java 内存模型,分析 JDK 源代码,探索 ConcurrentHashMap 高并发的具体实现机制. 由于 ConcurrentHashMap 的源代码实现依赖于 Java 内存模型,所以阅读本文需要读者了解 Java 内存模型.同时,ConcurrentHashMap 的源代码会涉及到散列算法和链表数据结构,所以,读者需要对散列算法和基于链表的数据结构有所了解. 回页首 Java 内存模型

详细游戏服务器端架构升级实录【干货】

一. 农业时代 创业最重要的就是一个"快"字,所以最开始的时候,所有的架构都以快速出模型为前提. 而常看我博客的朋友应该知道我对python情有独钟,所以自然的,python成为了我开发服务端框架的语言. python自带的多线程tcp服务器框架非常简单:ThreadingTCPServer,即每个链接一个线程的模式: import SocketServer class RequestHandler(SocketServer.BaseRequestHandler):     def h

Java---设计模块(设计模块的简介及最简单的俩个单例代码加测试)

设计模式学习概述: 为什么要学习设计模式 1.设计模式都是一些相对优秀的解决方案,很多问题都是典型的.有代表性的问题,学习设计模式,我们就不用自己从头来解决这些问题,相当于在巨人的肩膀上,复用这些方案即可. 2.设计模式已经成为专业人士的常用词汇,不懂不利于交流. 3.能让你设计的系统更加专业,让系统有更好的架构. 学习设计模式的层次 1.基本入门级--套用型(半年到一年左右时间领悟学会) 2.基本掌握级--可变形使用型(一年左右时间领悟学会) 3.真正理解和掌握级--思想上吸收和趋同型(看个人

使用Monitor对资源进行保护(一)

首先,来看下使用system.threading.monitor对资源进行保护的思路:   即,使用排它锁,当线程A需要访问某一资源时,对其进行加锁,线程A获取到锁以后,任何其他线程如果再次对资源进行访问,则将其放到等待队列中,知道线程A释放锁之后,再将线程从队列中取出.    主要的两个方法: Enter Exit 获取锁 释放锁      接着是如何利用enter和exit方法实现线程保护的: 使用对象本身作为锁对象 using System; using System.Collection

C++开发:为什么多线程读写shared_ptr要加锁的详细介绍_C 语言

我在<Linux 多线程服务端编程:使用 muduo C++ 网络库>第 1.9 节"再论 shared_ptr 的线程安全"中写道: (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的线程

多线程读写 shared_ptr需要加锁的原因

我在<Linux 多线程服务端编程:使用 muduo C++ 网络库>第 1.9 节"再论 shared_ptr 的线程 安全"中写道: (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档 (http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的

java 多线程方法加锁获取自增变量重复问题

问题描述 java 多线程方法加锁获取自增变量重复问题 /** 测试多线程并发获取唯一子增长的值 @author Administrator * */ public class BB { private int increment = 0; final static Set set = new HashSet(); final static List list = new ArrayList(); public synchronized int getauto() { return increm

多线程什么时候该加锁?

1 .加锁.解锁(同步/互斥)是多线程中非常基本的操作,但我却看到不少的代码对它们处理的很不好.简单说来有三类问题,一是加锁范围太大,虽然避免了逻辑错误,但锁了不该锁的东西,难免降低程序的效率:二是该锁的不锁,导致各种莫名其妙的错误:三是加锁方式不合适,该用临界区的用内核对象等,也会降低程序的效率. 要正确的运用锁操作,首先要弄清楚什么时候需要加锁.一般可能"同时发生多个写操作"或"同时发生读写操作"时,必需要加Lock.   2,NET警惕匿名方法造成变量共享 h

多线程 同步 信号量-如果synchronized(new Object){} 和 Object obj = new Object(); synchronized(obj){}的区别是什么?

问题描述 如果synchronized(new Object){} 和 Object obj = new Object(); synchronized(obj){}的区别是什么? 如果synchronized(new Object){} 和 Object obj = new Object(); synchronized(obj){}的区别是什么? 主要是在synchronized()中放new Object 是四个线程一起,而放obj对象是一个一个的执行,这是什么原因呢? 代码: class X