如何在指定代码行同步两个CPU线程 使二者后续代码同时执行
问题原因分析
- 你手搓的标志位同步存在安全缺陷:
volatile仅能保证变量对所有线程可见,无法禁止指令重排,也没有提供内存屏障,可能出现标志位读写顺序错乱,导致同步逻辑失效。 - 自旋等待跳出后存在调度不确定性:单CPU采用时分复用调度,某一线程跳出循环时如果时间片耗尽,会被内核挂起,导致两个线程的A行执行间隔变大,无法满足"近似同时"的要求。
最优解决方案
用POSIX线程库原生提供的线程屏障(pthread_barrier),这是专门为「N个线程到达同一点后同时继续执行」的场景设计的同步原语,内核层面会尽可能同时唤醒所有等待的线程,最小化执行间隔。
实现代码
// 头文件需要新增 #include <pthread.h> static pthread_barrier_t sync_barrier; void *threadZero(void*){ // some codes // 到达同步点,阻塞等待另一个线程 pthread_barrier_wait(&sync_barrier); // line A of thread zero // some codes } void *threadOne(void*){ // some codes // 到达同步点,阻塞等待另一个线程 pthread_barrier_wait(&sync_barrier); // line A of thread one // some codes } int main(){ // 初始化屏障,指定需要等待的线程数为2 pthread_barrier_init(&sync_barrier, NULL, 2); // 创建两个线程并等待执行结束 // ... // 销毁屏障 pthread_barrier_destroy(&sync_barrier); }
优化建议(进一步缩小执行间隔)
如果业务对两个线程的执行间隔要求极高,可以在屏障返回后做以下优化:
- 临时提升两个线程的调度优先级,减少调度被打断的概率
- 自旋等待阶段可以添加
cpu_relax()(x86平台)指令降低自旋开销,避免无谓的CPU占用
注意:单CPU抢占式调度系统下不可能实现100%绝对同时执行,因为同一时间只能有一个线程占用CPU,使用pthread_barrier可以将两个线程的执行间隔控制在微秒级,满足绝大多数场景的需求。
内容的提问来源于stack exchange,提问作者mehran
相关产品推荐
相关产品推荐

