使用gdb执行set variable修改局部变量是否会作用于所有线程?
问题解答
首先明确核心结论:
- 该
set variable命令仅会修改当前gdb选中线程的block变量值,最终只会解除1个线程的阻塞,其余4个线程仍会保持阻塞状态。
具体原因如下:
变量存储特性
你代码中定义的block是foo函数内的非静态局部变量,这类变量的存储空间分配在对应执行线程的栈上。每个线程都有独立的栈空间,因此5个线程执行foo时,会各自在自己的栈上生成一份独立的block副本,不同线程的block变量完全独立、互不影响。GDB命令的作用范围
当你切换到指定线程后执行set variable block=false,gdb只会在当前选中线程的当前栈帧中查找block变量,修改的也仅为该线程栈上的block副本,并不会遍历修改其他线程栈上的同名变量。阻塞解除逻辑
修改完成后,只有当前被修改的线程对应的while循环判断条件变为false,可以退出循环结束阻塞;其余4个线程的block值仍为true,会继续卡在死循环中保持阻塞。
补充说明:如果代码中
block被定义为静态局部变量(static bool block = true;),该变量会存储在进程的全局数据段,所有线程共享同一份副本,此时执行修改命令会改变所有线程访问的block值,所有线程都会解除阻塞。
内容的提问来源于stack exchange,提问作者The Vivandiere
相关产品推荐
相关产品推荐

