设计思路
- 线程池规划
- 根据不同模块的线程需求,将任务分类。例如,I/O 密集型任务可分配到一组线程,CPU 密集型任务分配到另一组。
- 确定线程池的大小。对于 CPU 密集型任务,线程数可设为 CPU 核心数;I/O 密集型任务,可适当增加线程数,以充分利用等待 I/O 的时间。
- 锁机制管理
- 尽量减少锁的使用范围,只在必要的资源访问处加锁。
- 采用层次化的锁机制,为不同模块或资源分配不同级别的锁,避免循环依赖。
- 使用
NSRecursiveLock
处理递归调用中的锁问题,确保同一线程可多次获取锁。
- 任务优先级处理
- 为每个任务分配优先级,例如分为高、中、低三个等级。
- 使用优先级队列来管理任务,高优先级任务优先执行。
- 避免死锁和线程饥饿
- 死锁避免:按固定顺序获取锁,避免循环获取锁的情况。定期检查锁的持有情况,若发现死锁,及时解除。
- 线程饥饿避免:为低优先级任务设置一定的执行时间配额,防止高优先级任务一直占用资源。
关键代码框架示例
- 线程池创建
#import <Foundation/Foundation.h>
@interface ThreadPool : NSObject
@property (nonatomic, strong) NSOperationQueue *operationQueue;
+ (instancetype)sharedThreadPool;
- (void)addTask:(NSBlockOperation *)task;
@end
@implementation ThreadPool
+ (instancetype)sharedThreadPool {
static ThreadPool *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[ThreadPool alloc] init];
sharedInstance.operationQueue = [[NSOperationQueue alloc] init];
sharedInstance.operationQueue.maxConcurrentOperationCount = 5; // 根据需求调整
});
return sharedInstance;
}
- (void)addTask:(NSBlockOperation *)task {
[self.operationQueue addOperation:task];
}
@end
- 锁机制
#import <Foundation/Foundation.h>
@interface Resource : NSObject
@property (nonatomic, strong) NSRecursiveLock *resourceLock;
- (instancetype)init;
- (void)accessResource:(void (^)(void))block;
@end
@implementation Resource
- (instancetype)init {
self = [super init];
if (self) {
self.resourceLock = [[NSRecursiveLock alloc] init];
}
return self;
}
- (void)accessResource:(void (^)(void))block {
[self.resourceLock lock];
block();
[self.resourceLock unlock];
}
@end
- 任务优先级处理
#import <Foundation/Foundation.h>
@interface PriorityOperation : NSBlockOperation
@property (nonatomic, assign) NSInteger priority;
+ (instancetype)operationWithPriority:(NSInteger)priority block:(void (^)(void))block;
@end
@implementation PriorityOperation
+ (instancetype)operationWithPriority:(NSInteger)priority block:(void (^)(void))block {
PriorityOperation *operation = [[PriorityOperation alloc] initWithBlock:block];
operation.priority = priority;
return operation;
}
@end
@interface PriorityQueue : NSOperationQueue
- (void)addOperationWithPriority:(NSInteger)priority block:(void (^)(void))block;
@end
@implementation PriorityQueue
- (void)addOperationWithPriority:(NSInteger)priority block:(void (^)(void))block {
PriorityOperation *operation = [PriorityOperation operationWithPriority:priority block:block];
[self addOperation:operation];
[self.operations sortedArrayUsingComparator:^NSComparisonResult(PriorityOperation *op1, PriorityOperation *op2) {
return op1.priority > op2.priority ? NSOrderedDescending : NSOrderedAscending;
}];
}
@end