面试题答案
一键面试确保不同线程采集的数据准确同步
- 使用锁(Lock):
- 互斥锁(Mutex):在Objective - C中,可以使用
NSLock
类。例如:
NSLock *dataLock = [[NSLock alloc] init]; - (void)collectData { [dataLock lock]; // 进行数据采集操作 [dataLock unlock]; }
- 递归锁(Recursive Lock):适用于同一线程可能多次获取锁的情况,使用
NSRecursiveLock
。例如:
NSRecursiveLock *recursiveLock = [[NSRecursiveLock alloc] init]; - (void)recursiveCollectData { [recursiveLock lock]; // 采集数据操作 [self recursiveCollectData]; [recursiveLock unlock]; }
- 互斥锁(Mutex):在Objective - C中,可以使用
- 信号量(Semaphore):使用
dispatch_semaphore_t
。例如:dispatch_semaphore_t semaphore = dispatch_semaphore_create(1); - (void)collectDataWithSemaphore { dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // 数据采集 dispatch_semaphore_signal(semaphore); }
- 原子属性(Atomic Properties):在定义属性时,使用
atomic
关键字。例如:
虽然@interface DataCollector : NSObject @property (nonatomic, atomic, strong) NSMutableArray *collectedData; @end
atomic
能保证属性读写的原子性,但它并不能保证复合操作(如对数组进行添加和删除元素)的线程安全性。
利用GCD高效处理多线程采集到的性能数据
- 队列同步:
- 串行队列:使用
dispatch_queue_create
创建一个串行队列,确保数据处理按顺序进行,避免数据冲突。例如:
dispatch_queue_t serialQueue = dispatch_queue_create("com.example.serialDataAnalysisQueue", DISPATCH_QUEUE_SERIAL); dispatch_async(serialQueue, ^{ // 对采集到的数据进行分析处理 });
- 并发队列:对于可以并行处理的任务,使用
dispatch_get_global_queue
获取全局并发队列。例如:
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(globalQueue, ^{ // 并行分析数据 });
- 串行队列:使用
- 栅栏函数(Barrier):当需要对共享资源进行读写操作时,使用栅栏函数可以确保在读写操作之间进行同步。例如:
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.example.concurrentDataQueue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(concurrentQueue, ^{ // 读取数据操作 }); dispatch_barrier_async(concurrentQueue, ^{ // 写入数据操作 }); dispatch_async(concurrentQueue, ^{ // 读取数据操作 });
利用NSOperationQueue高效处理多线程采集到的性能数据
- 创建操作(NSOperation):可以创建
NSInvocationOperation
或NSBlockOperation
,或者自定义继承自NSOperation
的子类。例如,使用NSBlockOperation
:NSBlockOperation *analysisOperation = [NSBlockOperation blockOperationWithBlock:^{ // 数据处理代码 }];
- 添加依赖关系:如果某些操作依赖于其他操作完成,可以设置依赖关系。例如:
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ // 操作1的数据采集 }]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ // 操作2的数据处理,依赖于操作1完成 }]; [operation2 addDependency:operation1];
- 操作队列(NSOperationQueue):将操作添加到队列中执行。例如:
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; [operationQueue addOperation:operation1]; [operationQueue addOperation:operation2];
通过上述方法,可以在Objective - C中有效地确保多线程环境下数据采集的同步,并高效地处理采集到的性能数据,避免数据冲突和性能瓶颈。