1-16.【GCD】barrier 会创建新的线程吗?为什么?

2 阅读2分钟

不,dispatch_barrier 本身不会创建新的线程
它只是一个 队列级别的调度控制机制,线程的使用依赖队列的 target 和系统线程池。下面详细解释原因和原理。


1️⃣ 核心结论

Barrier 是屏障控制,而不是线程创建机制。它控制任务在队列中的执行顺序和互斥性,但使用的线程依然来自并发队列的线程池(通常是全局队列或系统 worker threads)。

换句话说:

  • barrier 不关心线程数量

  • barrier 只关心 “在屏障执行时独占队列”

  • 执行线程可能:

    • 当前线程(fast-path)
    • 队列内部分配的已有 worker thread
  • barrier 不会新建线程


2️⃣ 为什么不需要创建线程

2.1 barrier 的作用

Barrier 的语义:

  1. 队列中的前置任务完成后才执行 barrier
  2. barrier 执行期间独占队列,不允许其他任务执行
  3. barrier 完成后恢复队列并发执行

✅ 这 完全是队列调度逻辑,和线程数量无关。


2.2 线程已经由队列提供

  • 并发队列(自定义或 global queue)都有一个线程池

  • 提交任务时:

    • GCD 会选择一个空闲线程执行任务
    • barrier 任务也在这个线程池里执行

不需要也不应该新建线程,否则开销太大


3️⃣ fast-path 场景

在某些情况下:

queue.async(flags: .barrier) { work() }
  • 如果当前线程空闲且队列可派发:

    • barrier 直接在当前线程执行
    • 无需任何额外线程

所以 barrier 可以 复用线程,更高效


4️⃣ 线程 vs barrier 的误区

很多人误解:

  • “barrier 独占队列” → “barrier 会新开线程”

  • 实际上:

    • 独占的是队列的 派发权
    • 执行线程仍来自线程池或当前线程

所以:

  • Barrier ≠ 线程锁
  • Barrier ≠ 新线程

5️⃣ 总结

特性barrierthread
是否创建新线程由 queue/thread pool 决定
独占语义队列内部调度控制
并发队列中读写互斥通过执行计数 + FIFO 队列实现

一句话总结dispatch_barrier 只是一个 队列调度屏障,它不负责线程创建;执行 barrier 的线程来自队列已有的线程池或当前线程。