iOS GCD的线程阻塞

释放双眼,带上耳机,听听看~!

A、dispatch_semaphore信号量:

如果初始化的时候信号量为0,并且执行任务的过程中,没有发送信号,那么wait之后的任务全部不能执行。

B、dispatch_barrier_async栅栏:

会造成短暂的阻塞线程,实际上并不能算作真正的阻塞。

C、dispatch_group_wait线程等待:

在等待前面的任务执行的过程中,后面的任务全部停止,在这个等待的过程中,也等同于短暂的阻塞线程。

D、串行主队列

E、同步线程执行同步串行队列

F、异步线程执行同步串行队列

D、E、F会直接造成死锁,因为同步串行队列,只能一个一个任务的执行。不管是在新的同步线程里还是异步线程里执行都会造成相互等待,并且是永久的等待,所以直接死。


  • 加锁解锁方式

1、信号量

 

dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

//加锁
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//解锁
dispatch_semaphore_signal(semaphore);

2、NSLock

 

NSLock *myLock;

//加锁
[myLock lock];
//解锁
[myLock unlock];

3、synchronized互斥锁

 

@synchronized (self) {
   /*你的操作*/
}

 

人已赞赏
iOS文章

iOS 设置屏幕是否长亮

2019-12-24 15:13:24

iOS文章

iOS13禁用深色模式

2019-12-25 16:50:30

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索