返回
GCD底层源码剖析(二):深入探究同步函数与异步函数的奥秘
IOS
2024-01-29 20:33:06
同步函数与异步函数:一窥其区别
在介绍GCD底层源码分析之前,我们首先需要了解同步函数与异步函数之间的区别。
- 同步函数:
同步函数是指在调用期间会阻塞当前线程,直到函数执行完成。换句话说,同步函数在调用后,当前线程会一直等待,直到函数返回结果。
- 异步函数:
异步函数是指在调用期间不会阻塞当前线程,函数执行后会立即返回。异步函数通常会在另一个线程或队列中执行,以便在函数执行期间当前线程可以继续执行其他任务。
GCD底层源码剖析:同步函数与异步函数的实现原理
dispatch_sync函数
dispatch_sync函数是GCD中用于实现同步函数调用的函数。它的声明如下:
void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
其中,
- dispatch_queue_t queue: 要将同步函数提交到的队列。
- dispatch_block_t block: 要执行的同步函数。
dispatch_sync函数的实现原理如下:
- 将同步函数包装成一个任务(task)。
- 将任务提交到指定的队列中。
- 当前线程阻塞,直到任务执行完成。
- 任务执行完成后,当前线程继续执行。
dispatch_async函数
dispatch_async函数是GCD中用于实现异步函数调用的函数。它的声明如下:
void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
其中,
- dispatch_queue_t queue: 要将异步函数提交到的队列。
- dispatch_block_t block: 要执行的异步函数。
dispatch_async函数的实现原理如下:
- 将异步函数包装成一个任务(task)。
- 将任务提交到指定的队列中。
- 当前线程立即返回,继续执行其他任务。
- 任务在另一个线程或队列中执行。
_dispatch_sync函数
_dispatch_sync函数是GCD中用于实现同步函数调用的内部函数。它的声明如下:
void _dispatch_sync(dispatch_queue_t queue, dispatch_time_t timeout, dispatch_block_t block);
其中,
- dispatch_queue_t queue: 要将同步函数提交到的队列。
- dispatch_time_t timeout: 同步函数执行的超时时间。
- dispatch_block_t block: 要执行的同步函数。
_dispatch_sync函数的实现原理如下:
- 将同步函数包装成一个任务(task)。
- 将任务提交到指定的队列中。
- 当前线程阻塞,直到任务执行完成或超时。
- 任务执行完成后或超时后,当前线程继续执行。
结论
通过对GCD底层源码的分析,我们深入了解了同步函数与异步函数的实现原理。同步函数会阻塞当前线程,直到函数执行完成,而异步函数不会阻塞当前线程,函数执行后会立即返回。GCD提供了dispatch_sync、dispatch_async和_dispatch_sync函数来实现同步函数和异步函数的调用。