线程创建与销毁优化
- 原理:频繁创建和销毁线程开销大,包括内核资源分配、线程上下文切换等。复用线程可减少这些开销。
- 实现方式:
- 线程池:使用NSOperationQueue来实现线程池的功能。NSOperationQueue可以管理一组NSOperation对象,将任务封装成NSOperation并添加到队列中,队列会自动复用线程来执行任务。例如:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
// 具体任务代码
}];
[queue addOperation:operation];
- 单例线程:对于一些需要长期运行且不需要频繁销毁的线程,可以创建单例线程。例如,在一个类中创建一个静态的NSThread实例,并且只在第一次需要时创建,后续直接复用。
@interface MyClass : NSObject
@property (nonatomic, strong) NSThread *myThread;
+ (instancetype)sharedInstance;
@end
@implementation MyClass
+ (instancetype)sharedInstance {
static MyClass *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
instance.myThread = [[NSThread alloc] initWithTarget:self selector:@selector(runThread) object:nil];
[instance.myThread start];
});
return instance;
}
- (void)runThread {
// 线程执行的代码
}
@end
资源竞争处理
- 原理:多线程同时访问共享资源可能导致数据不一致等问题,需要同步机制来确保同一时间只有一个线程访问共享资源。
- 实现方式:
- 互斥锁(NSLock):
- 原理:同一时间只允许一个线程持有锁,持有锁的线程才能访问共享资源,其他线程等待。
- 实现:
NSLock *lock = [[NSLock alloc] init];
- (void)accessSharedResource {
[lock lock];
// 访问共享资源的代码
[lock unlock];
}
- 条件锁(NSCondition):
- 原理:在互斥锁的基础上增加条件判断,线程可以在满足特定条件时才访问共享资源。
- 实现:
NSCondition *condition = [[NSCondition alloc] init];
- (void)producer {
[condition lock];
// 生产数据
[condition signal];
[condition unlock];
}
- (void)consumer {
[condition lock];
while (!dataAvailable) {
[condition wait];
}
// 消费数据
[condition unlock];
}
- 读写锁(NSReadWriteLock):
- 原理:允许多个线程同时读共享资源,但只允许一个线程写,写操作时不允许读。
- 实现:
NSReadWriteLock *rwLock = [[NSReadWriteLock alloc] init];
- (void)readSharedResource {
[rwLock readLock];
// 读操作代码
[rwLock unlock];
}
- (void)writeSharedResource {
[rwLock writeLock];
// 写操作代码
[rwLock unlock];
}
线程调度优化
- 原理:合理调度线程可提高系统整体性能,避免某些线程长时间占用CPU,使其他线程有机会执行。
- 实现方式:
- 设置线程优先级:
- 原理:通过设置线程优先级,让系统优先调度优先级高的线程执行。
- 实现:
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(myTask) object:nil];
[thread setThreadPriority:0.8]; // 优先级范围0.0 - 1.0,1.0最高
[thread start];
- 线程休眠与唤醒:
- 原理:对于一些不需要实时执行的线程,让其休眠一段时间,释放CPU资源,在合适的时候再唤醒。
- 实现:
// 休眠
[NSThread sleepForTimeInterval:2.0];
// 唤醒(在另一个线程中发送信号等方式唤醒特定线程)
- 线程亲和性(Thread Affinity):在某些特定场景下(如多核心CPU),将线程固定到特定的CPU核心上执行,可以减少跨核心调度的开销。虽然iOS系统对线程亲和性的控制相对有限,但在一些底层开发或特定环境下可以利用相关API实现(如pthread_setaffinity_np函数,不过在iOS上使用需要谨慎,因为可能违反App Store规则)。