我在接受采访时被问到,特定线程中的auto / global变量是否可见其他线程?由于Threads使用相同的地址空间,它看起来像是可见的 但我想每个线程都有自己的控制块,它不应该是可见的。
你对此有何看法?
答案 0 :(得分:2)
[编辑:oops,我已经回答了C ++而不是C.但是C11有点类似于C ++ 11:它也有“线程存储持续时间”,它在我下面描述的两种意义上都使用“可见” 。所以两者的答案基本相同。在C(++)11标准之前,Posix和其他线程模型多年来都具有线程局部存储的全局变量。]
定义“可见”[*]。
内存是“可见的”,在某种意义上说,如果你有一个对象的地址,那么你可以从另一个线程访问它。如果您创建数据竞争,可能会有未定义的行为。
具有静态存储持续时间的全局变量也是“可见的”,因为全局名称是指所有线程中的同一对象。
具有线程存储持续时间的全局变量每个线程都有一个单独的对象,名称是指属于执行代码的线程的对象。因此,它们不会按名称“显示”到不同的线程,但如果您决定将地址从一个线程传递到另一个线程,则仍然可以访问该对象。
自动变量在相同线程中的名称甚至不是“可见的”,来自除了它们所定义的范围之外的任何范围。自动变量的名称是指创建的对象对于当前函数的调用。如果函数是递归的,则每个线程可以有多个这样的调用,每个调用都有自己的一组相同名称的自动变量。如果从不同的线程同时调用该函数,那么每个函数都有自己的自动变量。因此,名称不是来自不同线程的“可见”。同样,对象本身也是可访问的。
[*]在C ++ 11标准中,1.10在内存可见的意义上使用“可见”一词,而不是指在不同线程/范围内引用单个对象的名称。但它没有正式定义这个词。它也使用“可见”,意思是名称在3.3.2 / 2范围内,而其他地方在至少我发现的其他两种情境中使用“可见”。
答案 1 :(得分:0)
如果有问题的线程属于同一个进程,(或者处理器/操作系统不提供受保护的进程内存管理),那么是。