线程是否共享局部变量?

Ton*_*rng 12 multithreading operating-system

我正在阅读Silberschatz第7版的操作系统概念,它说同一进程的线程共享代码部分,数据部分和其他OS资源,但是有不同的堆栈和寄存器集.但是,我正在研究的问题集表明线程共享局部变量,但不是存储在堆栈中的局部变量,因此各个线程应该有自己的副本?

Sum*_*eet 16

Threads 通常分享以下内容.

  1. 数据段(全局变量,静态数据)
  2. 地址空间.
  3. 代码段.
  4. I/O,如果文件打开,所有线程都可以读/写它.
  5. 父进程id.

但是threads保留自己的副本stack,并且局部变量存储在堆栈中,所以是的,你是对的,每个线程应该有自己的局部变量副本.

可能是它使用的不好的术语,或者可能是特定于问题集的东西.

  • 只是添加额外的信息,虽然线程维护自己单独的堆栈,但由于它们都位于与父进程相同的地址空间中,因此线程可以访问同一进程中另一个线程的局部变量。然而,这确实是非常糟糕的做法。 (3认同)

Jon*_*urg 5

符合 POSIX 标准的操作系统的线程必须共享局部变量(也称为自动变量)。来自 XBD 卷,基本定义,第 3 章,定义,条目 3.404,开放组基本规范第 7 期的主题(在回答时):

任何其地址可以由线程确定的东西,包括但不限于静态变量、通过 malloc() 获得的存储、通过实现定义的函数获得的直接可寻址存储以及自动变量,都可以被同一进程中的所有线程访问。

10如果假设静态变量确实在线程之间共享,那么以下带有输出的代码应该足以举例说明我的主张:

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>

static int* shared_pointer = NULL;

void* alter_thread_entry(void* arg) {
    // The following variable will be reachable,
    // while it exists, by both the main and the alter thread.
    int local_variable = 10;
    shared_pointer = &local_variable;
    sleep(2);
    return 0;
}

int main() {
    pthread_t alter_thread;
    pthread_create(&alter_thread, NULL, alter_thread_entry, NULL);
    sleep(1);
    printf("%i", *shared_pointer);
    fflush(stdout);
    pthread_join(alter_thread, NULL);
}
Run Code Online (Sandbox Code Playgroud)

跟踪线程控制执行的调用堆栈不是进程的线程之间共享的。然而,这一点取决于实现,因为上述标准中没有对此进行任何规定。