返回

GCD底层源码剖析(二):深入探究同步函数与异步函数的奥秘

IOS

同步函数与异步函数:一窥其区别

在介绍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函数的实现原理如下:

  1. 将同步函数包装成一个任务(task)。
  2. 将任务提交到指定的队列中。
  3. 当前线程阻塞,直到任务执行完成。
  4. 任务执行完成后,当前线程继续执行。

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函数的实现原理如下:

  1. 将异步函数包装成一个任务(task)。
  2. 将任务提交到指定的队列中。
  3. 当前线程立即返回,继续执行其他任务。
  4. 任务在另一个线程或队列中执行。

_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函数的实现原理如下:

  1. 将同步函数包装成一个任务(task)。
  2. 将任务提交到指定的队列中。
  3. 当前线程阻塞,直到任务执行完成或超时。
  4. 任务执行完成后或超时后,当前线程继续执行。

结论

通过对GCD底层源码的分析,我们深入了解了同步函数与异步函数的实现原理。同步函数会阻塞当前线程,直到函数执行完成,而异步函数不会阻塞当前线程,函数执行后会立即返回。GCD提供了dispatch_sync、dispatch_async和_dispatch_sync函数来实现同步函数和异步函数的调用。