Ton*_*rng 12 multithreading operating-system
我正在阅读Silberschatz第7版的操作系统概念,它说同一进程的线程共享代码部分,数据部分和其他OS资源,但是有不同的堆栈和寄存器集.但是,我正在研究的问题集表明线程共享局部变量,但不是存储在堆栈中的局部变量,因此各个线程应该有自己的副本?
Sum*_*eet 16
Threads 通常分享以下内容.
但是threads保留自己的副本stack,并且局部变量存储在堆栈中,所以是的,你是对的,每个线程应该有自己的局部变量副本.
可能是它使用的不好的术语,或者可能是特定于问题集的东西.
符合 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)
跟踪线程控制执行的调用堆栈不是进程的线程之间共享的。然而,这一点取决于实现,因为上述标准中没有对此进行任何规定。