MST
星途 面试题库

面试题:Objective-C中NSThread类在复杂多线程场景下的性能优化策略

假设你正在开发一个具有复杂业务逻辑和大量多线程操作的Objective-C应用程序,使用NSThread类来管理线程。请阐述在这种场景下,你会采用哪些性能优化策略,包括但不限于线程的创建与销毁优化、资源竞争处理以及线程调度优化等,并说明其原理和实现方式。
15.8万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

线程创建与销毁优化

  1. 原理:频繁创建和销毁线程开销大,包括内核资源分配、线程上下文切换等。复用线程可减少这些开销。
  2. 实现方式
    • 线程池:使用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

资源竞争处理

  1. 原理:多线程同时访问共享资源可能导致数据不一致等问题,需要同步机制来确保同一时间只有一个线程访问共享资源。
  2. 实现方式
    • 互斥锁(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];
}

线程调度优化

  1. 原理:合理调度线程可提高系统整体性能,避免某些线程长时间占用CPU,使其他线程有机会执行。
  2. 实现方式
    • 设置线程优先级
      • 原理:通过设置线程优先级,让系统优先调度优先级高的线程执行。
      • 实现
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规则)。