设置变量是否跨线程修改变量值?

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() 可能有助于解决这两个问题。