c - 特定线程内的自动/全局变量是否对其他线程可见

标签 c multithreading operating-system

我在一次采访中被问到,特定线程中的自动/全局变量是否对其他线程可见?由于线程使用相同的地址空间,因此它看起来像是可见的 但我想每个线程都有自己的控制 block ,它不应该是可见的。

您对此有何看法?

最佳答案

[编辑:糟糕,我已经回答了 C++ 而不是 C。但是 C11 与 C++11 有点相似:它也有“线程存储持续时间”,并且在我下面描述的两种意义上它也使用“可见” .所以两者的答案几乎相同。在 C(++)11 标准之前,Posix 和其他线程模型多年来一直使用全局线程本地存储。]

定义“可见”[*]。

内存是“可见的”,也就是说,如果您有对象的地址,那么您就可以从另一个线程访问它。如果您创建数据竞争,可能会出现未定义的行为。

具有静态存储持续时间的全局变量也是“可见的”,因为全局变量的名称在所有线程中指的是同一个对象。

具有线程存储持续时间的全局变量每个线程都有一个单独的对象,名称指的是属于代码正在执行的线程的对象。因此,它们对于名称不同的线程“不可见”,但如果您决定将地址从一个线程传递到另一个线程,对象本身仍然可以访问。

自动变量在同一个线程中甚至在定义它们的范围之外的任何范围内都“不可见”。自动变量的名称指的是创建的对象对于函数的当前调用。如果函数是递归的,每个线程可以有多个这样的调用,每个线程都有自己的一组同名自动变量。如果从不同的线程同时调用该函数,则同样每个线程都有自己的自动变量。所以这些名字在不同的线程中是“不可见的”。同样,对象本身是可访问的。

[*] 在 C++11 标准中,1.10 在内存可见的意义上使用“可见”一词,而不是在不同线程/作用域中指代单个对象的名称意义上。但它没有正式定义这个词。它还在 3.3.2/2 范围内的名称意义上使用“可见”,并且在其他地方至少在我目前发现的两个其他上下文中使用“可见”。

关于c - 特定线程内的自动/全局变量是否对其他线程可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8801255/

相关文章:

c - 基本的 posix 线程参数传递问题

java - 并发加载文件时如何确定线程数

java - 流程卡在流程构建器上

python - 使用 Python 脚本进行 SSH 和 Screen

java - 如何使用 Java 获取 IP 地址已知的计算机上安装的操作系统信息和数据库?

c - 定义变量时使用 'extern' 关键字

c - 从管道读取字符串不一致

c++ - 调用 std::future::get() 后线程真的启动了吗?

c - linux 内核代码 ">>"运算符

c - 如何知道引用的 fp 当前正在写入哪个文件?