pthread多线程程序无法并行、单线程顺序执行问题咨询
问题原因与解决方案
核心原因
你代码中所有同步逻辑都被#ifdef PTHREAD_SYNC条件编译块包裹,编译时未定义该宏的情况下,互斥锁、屏障相关代码不会被编译进程序,线程无任何同步约束,再结合不同设备的CPU调度策略差异,就出现了不同设备运行表现不一致的问题。
具体分析
- 线程执行逻辑耗时极短:单个线程跑完20次循环仅包含简单的内存读写、打印操作,耗时远小于操作系统分配给线程的默认时间片
- 不同设备调度策略差异:笔记本CPU通常核心数更多、抢占调度更激进,线程创建后会立刻被调度到不同核心并行执行,就会出现交替运行的预期表现;而台式机/虚拟机若CPU核心数较少、调度策略偏向于让当前线程跑完时间片再切换,就会出现第一个线程执行完所有循环后,第二个线程才开始调度的顺序执行表现
- 你看到的最终值刚好为40只是巧合:无同步的情况下多线程并发读写共享变量会触发数据竞争,最终值本应小于
20*线程数,你当前测试环境下线程完全顺序执行才没触发数据竞争,不代表无同步的代码是正确的
修复方法
编译时加上PTHREAD_SYNC宏定义即可,参考编译命令:
gcc 你的代码文件名.c -o thread_demo -lpthread -DPTHREAD_SYNC
开启宏定义后互斥锁会保证同一时间只有一个线程读写共享变量,屏障会保证所有线程完成20次循环后再打印最终值,不同设备上都能看到线程交替执行的正常表现。
内容的提问来源于stack exchange,提问作者Nathan B
相关产品推荐
相关产品推荐

