使用信号量实现线程屏障存在忙等问题的原因咨询
忙等的具体位置
忙等出现在代码里的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
相关产品推荐
相关产品推荐

