【发布时间】:2012-01-10 09:49:43
【问题描述】:
我在一次采访中被问到,特定线程内的自动/全局变量是否对其他线程可见?由于线程使用相同的地址空间,它看起来像是可见的 但我猜每个线程都有自己的控制块,它不应该是可见的。
您对此有何看法?
【问题讨论】:
标签: c multithreading operating-system
我在一次采访中被问到,特定线程内的自动/全局变量是否对其他线程可见?由于线程使用相同的地址空间,它看起来像是可见的 但我猜每个线程都有自己的控制块,它不应该是可见的。
您对此有何看法?
【问题讨论】:
标签: c multithreading operating-system
[编辑:哎呀,我回答的是 C++ 而不是 C。但是 C11 有点类似于 C++11:它也有“线程存储持续时间”,并且在我下面描述的两种意义上它也使用“可见” .因此,两者的答案几乎相同。在 C(++)11 标准之前,Posix 和其他线程模型多年来一直使用具有线程本地存储的全局变量。]
定义“可见”[*]。
内存是“可见的”,如果你有一个对象的地址,那么你可以从另一个线程访问它。如果您创建数据竞争,可能会出现未定义的行为。
具有静态存储持续时间的全局变量也是“可见的”,因为全局名称在所有线程中都指向同一个对象。
具有线程存储持续时间的全局对象每个线程都有一个单独的对象,名称指的是属于正在执行代码的线程的对象。因此它们对不同的线程按名称是不“可见的”,但如果您决定将地址从一个线程传递到另一个线程,对象本身仍然是可访问的。
自动变量在 same 线程中甚至不是“可见”的,在它们定义的范围之外的任何范围内。自动变量的名称是指创建的对象用于函数的当前调用。如果函数是递归的,则每个线程可以有多个这样的调用,每个调用都有自己的一组同名自动变量。如果从不同线程同时调用该函数,则同样每个线程都有自己的自动变量。所以这些名字在不同的线程中是不“可见的”。同样,对象本身是可访问的。
[*] 在 C++11 标准中,1.10 在内存可见的意义上使用“可见”一词,而不是在不同线程/作用域中引用单个对象的名称的意义上。但它没有正式定义这个词。它还在 3.3.2/2 的范围内使用“可见”这个名称,在其他地方至少在我目前发现的其他两个上下文中使用“可见”。
【讨论】:
如果有问题的线程属于同一个进程,(或者处理器/操作系统不提供受保护的进程内存管理),那么是的。
【讨论】: