1.数据竞争指的是多个线程同时对共享数据进行读写操作,从而导致程序行为不可预测或出现崩溃等问题
避免数据竞争的常见方法:
- 使用串行队列,代码示例:
NSInteger count = 0;
dispatch_queue_t serialQueue = dispatch_queue_create("com.example.serialQueue", DISPATCH_QUEUE_SERIAL);
void incrementCount() { dispatch_sync(serialQueue, ^{ count += 1; }); }
void decrementCount() { dispatch_sync(serialQueue, ^{ count -= 1; }); }
- 使用互斥锁,代码示例:
// 定义共享资源 NSMutableArray *array = [NSMutableArray array];
// 定义信号量 dispatch_semaphore_t sema = dispatch_semaphore_create(1);
// 在多线程中访问共享资源 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 等待信号量计数值大于等于1 dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
// 访问共享资源 [array addObject:@"data"]; // 信号量计数值加1 dispatch_semaphore_signal(sema);});
- 使用GCD的同步、异步任务
2.死锁指的是多个线程互相等待对方释放资源的情况,导致所有线程都无法继续执行。 为了避免死锁的出现,可以采取以下几种方法:
- 保证锁的顺序
- 避免持有多个锁
- 使用线程安全的数据结构
- 合理设置锁的粒度