线程与全局变量:未使用变量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
相关产品推荐
相关产品推荐

