设置变量是否跨线程修改变量值?
Does set variable modify variable values across threads?
假设我有一个函数foo
void foo () {
bool block = true;
while(block) {}
}
我有5个线程运行这个函数,都阻塞在while
循环中。
如果我将 gdb 附加到这个进程,并跳转到这 5 个线程之一,然后执行以下操作
(gdb) set variable block=false
我的问题是上面设置变量语句的全部作用是什么?
它是将所有线程上的 block
的值更改为 false
,还是只是 gdb 中的当前线程? 运行 上面的语句是只解除阻塞在 while 循环中的 5 个线程中的一个还是全部?
Does it change the value of block to false on all threads, or just the current thread in gdb?
只是当前线程。您有 5 个独立且 独立 的堆栈变量,名为 block
;期望 GDB 改变其中一个以上是不合理的。
Does running the above statement unblock only one or all of the 5 threads stuck in the while loop?
由此可见只有一个线程会被解阻塞
如果您想要一次解除对所有线程的阻塞,请将变量设置为全局变量(和 volatile
,因为您将从程序的“外部”修改它)。
P.S。您的自旋循环将消耗大量 CPU,并且允许编译器将它们编译出来。短期插入 usleep()
可能有助于解决这两个问题。
假设我有一个函数foo
void foo () {
bool block = true;
while(block) {}
}
我有5个线程运行这个函数,都阻塞在while
循环中。
如果我将 gdb 附加到这个进程,并跳转到这 5 个线程之一,然后执行以下操作
(gdb) set variable block=false
我的问题是上面设置变量语句的全部作用是什么?
它是将所有线程上的 block
的值更改为 false
,还是只是 gdb 中的当前线程? 运行 上面的语句是只解除阻塞在 while 循环中的 5 个线程中的一个还是全部?
Does it change the value of block to false on all threads, or just the current thread in gdb?
只是当前线程。您有 5 个独立且 独立 的堆栈变量,名为 block
;期望 GDB 改变其中一个以上是不合理的。
Does running the above statement unblock only one or all of the 5 threads stuck in the while loop?
由此可见只有一个线程会被解阻塞
如果您想要一次解除对所有线程的阻塞,请将变量设置为全局变量(和 volatile
,因为您将从程序的“外部”修改它)。
P.S。您的自旋循环将消耗大量 CPU,并且允许编译器将它们编译出来。短期插入 usleep()
可能有助于解决这两个问题。