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

Pthread多线程程序栈工作原理及示例代码竞态问题咨询

首先需要纠正一个基础认知误区:多线程共享的是所属进程的虚拟地址空间,每个线程都有独立的私有栈区域,这些栈都位于进程的地址空间内,线程可以通过指针访问其他线程栈上的数据,但默认情况下每个线程的局部变量都存储在自己的私有栈中,互不干扰。


问题1:第一段代码为什么没有一致性问题?

第一段代码中循环变量i是线程函数thr内部定义的局部变量,每个线程调用thr时,都会在自己的私有栈上创建独立的i副本,两个线程的计数完全独立,不存在共享读写的场景,因此不会出现一致性问题,两个线程各会打印0到49的完整序列。

问题2:第二段代码竞态问题的成因

第二段的变量i是全局变量,存储在进程的全局数据区,属于所有线程共享的资源:

  • 两个线程同时对同一个i执行「读取判断大小→自增→打印」操作,这些操作都不是原子操作
  • 可能出现线程A刚读取完i=10还没完成自增,线程B也读取到i=10的情况,最终两个线程都打印10、自增后i变成11,出现重复计数
  • 极端场景下当i=49时两个线程同时判断i<50成立,会先后自增为50、51,出现超出预期的打印结果
  • 因为没有任何同步机制控制多线程对共享变量的读写顺序,最终执行结果完全不可预测。

问题3:是否只有主线程的栈是多线程共享的?

不是。
整个进程的虚拟地址空间对所有线程都是可读可写的,只要拿到了某块地址的指针,不管这块地址属于哪个线程的私有栈,其他线程都可以直接访问。
第三段代码的竞态本质和第二段完全一致:你把主线程栈上变量i的指针传给了两个子线程,两个子线程同时通过指针读写同一个i变量,才引发了竞态。如果你将某个子线程栈上的变量地址传给其他线程操作,也会出现完全相同的竞态问题,主线程栈没有任何特殊性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:27:02