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

线程与全局变量:未使用变量y为何输出10或15?

多线程输出10的原因解析

我知道两个线程都能访问全局变量k和p,当一个线程的CPU时间片耗尽后,另一个线程会获得CPU时间片,这也是我得到9、10这类不同输出的原因,但我不理解输出10是如何产生的。我猜测这与变量y有关,尽管我并未使用它。

int k=2;
int* p;
void t1_f1(void){
    int x=3;
    p=&x;
    sleep(1);
}

void t1_f2(void){
    int y=5;
    k++;
    sleep(1);
}

void* t1_main(void* args){
    t1_f1();
    t1_f2();
    return NULL;
}

void* t2_main(void* args){
    sleep(1);
    k=k* *p;
    printf("%d \n", k);
    return NULL;
}

int main(int argc, char ** argv){
    pthread_t threads[2];
    pthread_create(threads+1, NULL, t2_main, NULL);
    pthread_create(threads, NULL, t1_main, NULL);
    pthread_join(threads[0],NULL);
    pthread_join(threads[1],NULL);
    exit(0);
}

核心原因:野指针+栈帧复用

  • t1_f1执行完毕返回后,局部变量x所在的栈帧会被释放,此时全局指针p指向的是一块已失效的栈内存,属于野指针,后续访问*p的行为完全未定义。
  • 当t1_main调用t1_f2时,t1_f2的栈帧会复用之前t1_f1占用的栈空间(函数调用栈的空间是重复利用的),所以局部变量y的内存地址刚好和之前x的地址重合。
  • 输出10的场景:线程2的sleep(1)结束后,t1_f1已经执行完成,t1_f2已经完成y=5的初始化,但还没执行k++。此时线程2访问*p会读到y的值5,计算k = 2 * 5 = 10,最终输出10。
  • 输出9的场景:线程2执行计算时,t1_f2已经完成k++(此时k=3),且*p刚好读到栈中残留的x的值3,计算3*3=9。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:50:19