【问题标题】:Will the auto/global variables inside a particular thread visible to other thread特定线程内的自动/全局变量是否对其他线程可见
【发布时间】:2012-01-10 09:49:43
【问题描述】:

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

您对此有何看法?

【问题讨论】:

    标签: c multithreading operating-system


    【解决方案1】:

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

    定义“可见”[*]。

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

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

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

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

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

    【讨论】:

    • 6.2.4, p6:尝试从与对象关联的线程以外的线程间接访问具有自动存储持续时间的对象的结果是实现定义的。我>
    【解决方案2】:

    如果有问题的线程属于同一个进程,(或者处理器/操作系统不提供受保护的进程内存管理),那么是的。

    【讨论】:

    • 但每个线程都有自己的堆栈和自动变量存储在堆栈上,所以如果我们看到这种方式答案将是 NO。
    • 每个线程都有自己的栈和寄存器,但是所有线程的栈在共享地址空间中都是可见的。如果一个线程在其堆栈上分配了某个对象,并将地址发送给另一个线程,则它们都将具有对该对象的平等访问权限。
    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2017-03-18
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多