GCD的线程阻塞

2019-03-11  本文已影响0人  邓布利多教授

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) {
   /*你的操作*/
}
上一篇 下一篇

猜你喜欢

热点阅读