`

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

分享到:
评论

相关推荐

    iOS多线程开发NSThread.pdf

    iOS 多线程开发 NSThread iOS 多线程开发 NSThread 是 iOS 平台上支持的多线程编程方式之一。多线程编程是指一个应用程序同时执行多个线程,以提高应用程序的响应速度和效率。iOS 支持多个层次的多线程编程,层次越...

    23种设计模式-C_版本

    在实现 Singleton Pattern 时,需要注意的是,在单线程情况下可以使用简单的实例创建方式,但是这种方式在多线程情况下却不是安全的。这是因为,在多线程情况下,多个线程可能同时运行到实例创建判断语句,从而导致...

    ios 基础知识 汇总文档

    ### iOS基础知识汇总文档:多线程开发 #### 引言 在iOS开发中,多线程技术是一项重要的技能,能够显著提高应用的响应速度及处理能力。本文将深入探讨iOS支持的不同多线程编程范式,并重点介绍`NSThread`的基础使用...

    iOS工程师面试题.docx编程资料

    #### 一、多线程开发理解及iOS中多线程实现方法 **多线程开发的基本理解** 多线程开发是现代软件开发中非常重要的一部分,尤其是在移动应用开发中,它能够提高应用的性能并优化用户体验。通过将计算密集型任务(如...

    实例解析iOS应用多线程开发中NSthread类的用法

    NSOperationQueue和GCD(Grand Central Dispatch)是常见的多线程解决方案,但这里我们将专注于NSThread类的使用,这是一种在Objective-C中创建和管理线程的传统方式。 一、NSThread的初始化 NSThread类提供了两种...

    java入门 练习题题库

    - **知识点**: `synchronized`关键字用于保证多线程环境下对象或方法的同步访问。 - **解析**: - `synchronized`关键字可以用来同步方法或同步代码块。 - 选项分析: - A. `transient`: 用于序列化,错误。 - B....

    Linux多线程使用互斥量同步线程

    互斥量(Mutex,Mutual Exclusion Object)是一种用于多线程编程中的同步机制,其目的是确保同一时间只有一个线程可以访问共享资源或临界区。这种机制可以有效地避免数据竞争和不一致的情况发生。 互斥量的工作原理...

    C#中的lock、Monitor、Mutex学习笔记

    为了保护应用程序的资源不被破坏,为多线程程序提供了三种加锁的机制,分别是:Monitor类、Lock关键字和Mutex类。 1. lock lock实现的功能是:使后进入的线程不会中断当前的线程,而是等待当前线程结束后再继续执行...

    第30章基础练习题V21

    3. 在给定的 `Test2_3` 程序中,`Counter` 类的 `inc` 和 `dec` 方法都对同一把锁 `lockObject` 加锁。因此,当一个线程执行 `inc` 方法并持有锁时,其他线程只能等待解锁才能执行 `inc` 或 `dec`。选项 C 描述了...

    java集合详解与总结

    - **适用场景**:在多线程环境中,如果需要一个线程安全的列表类型,可以选择`Vector`,尽管它的性能可能不如非线程安全的`ArrayList`。 #### Set:不允许重复元素的集合 - **HashSet**:使用哈希表实现的`Set`...

    Java并发学习笔记(二)——Synchronized关键字与ReetrantLock同步锁

    在Java多线程编程中,确保线程安全是非常重要的。Synchronized关键字和ReentrantLock是两种常见的同步机制,它们都用于保证线程的原子性、可见性和有序性,防止数据的不一致性。 1. **Synchronized关键字** - **...

    UNIX环境C编程开发培训

    这包括并发程序开发,如多线程和多进程模型的实现,以及对Oracle数据库的高级开发技术。 总的来说,这个培训课程旨在通过深入讲解UNIX环境下的C编程,提升开发者的系统编程技能,使他们能够熟练地利用UNIX的系统...

    循环队列实现源码(C、C++、Java)

    Java中同样可以使用类来实现循环队列,但需要注意线程安全问题,如果多线程环境下,需要加锁: ```java import java.util.Arrays; public class CycleQueue<T> { private T[] data; private int front, rear; ...

    面试题大全

    - 实现多线程的主要方法有两种:继承`Thread`类和实现`Runnable`接口。 - 同步的主要方法有使用`synchronized`关键字和`ReentrantLock`等高级并发工具。 #### 51. 启动一个线程是用run()还是start()? 启动线程应该...

    PHP面试题异常全面

    - **DOM (Document Object Model):** 在内存中构建一个完整的树状结构模型来表示整个XML文档,方便对文档进行修改和查询,但占用内存较多。 - **SAX (Simple API for XML):** 通过事件驱动的方式逐行解析XML文档,...

    Java面试题

    ArrayList是线程不安全的,这意味着在多线程环境下使用时,如果不加锁可能会导致数据不一致的问题。 - **Vector**:与ArrayList非常相似,但是Vector是线程安全的。它在进行修改操作时会自动加锁,确保了数据的一致...

    java考试试卷及答案.docx

    2. **Java特点**:Java的多线程特性使得它能同时执行多个任务,这是其程序并行机制的体现。而安全性、跨平台和可移植性是Java的其他重要特点。 3. **类声明**:正确的类声明是`public abstract class Car{···}`...

    java常见面试题合集

    这意味着在多线程环境中,使用`Vector`更为安全。 - `Vector`的一些方法默认情况下会同步执行,而`ArrayList`的方法不会自动同步。 2. **HashMap与Hashtable**: - **相似点**:两者都实现了`Map`接口,用于存储...

    JAVA的非常经典面试题

    - **wait()** 方法来自 Object 类,用于让当前线程等待,直到被其他线程唤醒。 #### Java 有没有 goto 语句? - Java 不支持传统的 C 语言中的 `goto` 语句,但提供了类似的标签跳转功能,即可以用带标签的 break ...

Global site tag (gtag.js) - Google Analytics