You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用信号量实现线程屏障存在忙等问题的原因咨询

忙等的具体位置

忙等出现在代码里的while(counter <= n);空循环语句上,信号量sem1的逻辑本身确实没有忙等问题,你的理解是对的:拿不到sem1的线程会进入操作系统的信号量等待队列,不占用CPU资源,只有sem1.post()触发唤醒时才会重新被调度。

为什么这行是空忙等

  • 第一个拿到sem1的线程完成counter += 1操作、释放sem1之后,就会进入这个while循环。只要counter的取值还小于等于n,这个线程就会持续占用CPU时间片,反复判断counter <= n的条件是否成立,不会主动进入阻塞状态让出CPU,这就是典型的忙等。
  • 第一个线程释放sem1之后,下一个等待的线程会立刻被唤醒,完成counter更新后也进入这个空循环忙等,以此类推,最终会有n个线程全部卡在这行空循环上占用CPU资源,直到最后一个线程把counter更新为n,所有线程的循环条件失效才会一起退出。

补充:这段代码还有额外的可见性隐患,如果counter没有被声明为volatile(或者没有同步机制保证可见性),线程可能会缓存counter的本地副本,感知不到其他线程对counter的更新,最终导致死循环无法退出。

内容的提问来源于stack exchange,提问作者Algo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:57:03