数据竞争和死锁

228 阅读1分钟

1.数据竞争指的是多个线程同时对共享数据进行读写操作,从而导致程序行为不可预测或出现崩溃等问题

避免数据竞争的常见方法:

  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; }); }

  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);

});

  1. 使用GCD的同步、异步任务

2.死锁指的是多个线程互相等待对方释放资源的情况,导致所有线程都无法继续执行。 为了避免死锁的出现,可以采取以下几种方法:

  1. 保证锁的顺序
  2. 避免持有多个锁
  3. 使用线程安全的数据结构
  4. 合理设置锁的粒度