代码之家  ›  专栏  ›  技术社区  ›  mko

说一个进程中的所有线程共享相同的数据是什么意思?

  •  3
  • mko  · 技术社区  · 14 年前

    在我的课本上说:

    进程中的所有线程都可以访问相同的数据(共享)

    但每个线程都有自己的堆栈,这意味着局部变量是不共享的。那么什么样的数据线程可以共享呢。

    更新:

    我发现每个线程都可以共享全局变量,这让我很困惑,我学到的全局变量是静态堆栈,不应该因为每个线程都有自己的堆栈而共享。

    5 回复  |  直到 14 年前
        1
  •  2
  •   Jon Hanna    14 年前

    首先,全局变量和静态变量是共享的。

    其次,可以通过全局变量中的指针(或通过…的指针)访问的malloc内存是共享的。

    第三,一个线程堆栈中的内存,您可以通过全局变量中的指针(或通过…的指针)访问该内存。

    实际上,所有这些都是共享的,但并不是所有这些都可以访问。线程A可以访问线程B的堆栈,但它不会有指针通过,除非线程B做了一些事情,比如将其堆栈中某个东西的地址分配给全局(不要这样做),或者你正在做一些事情,检查线程的细节并进入它们的堆栈(如果你这样做,你对pthreads实现的机制比我了解得多*,所以我不会告诉你不要这样做,但通常情况下,这不是一件容易的事情)。

    大多数情况下,你只需要担心全局和静态,并且可以认为任何只在本地进行交易的事情都是线程安全的,但一旦你能从前者到达后者,这一点就会被打破。

    *事实上,我对此知之甚少,而且主要是基于其他语言中的线程知识。实际上,这是一个通用的线程处理,而不是pthreads特定的线程,只是其他一些语言甚至不会让您陷入从全局引用堆栈内存的陷阱。

        2
  •  2
  •   cnicutar    14 年前

    我发现每个线程都可以共享全局变量,这让我很困惑, 我学到的全局变量是静态堆栈,它不应该是 每个线程都有自己的堆栈。

    你对堆栈考虑太多了,还有其他内存区域,比如 data bss .具有静态存储的对象(例如全局变量和用修饰符声明的对象 static )在所有线程之间共享。

    此外,如果你努力,所有线程都可以访问 每件事 ,不同的“堆栈”没有什么特别之处。如果一个线程设法获得指向另一个“堆栈”上某个位置的指针,它可以自由读取、修改它等等。

    所有这一切的要点是线程不仅仅共享变量。他们只是 在同一虚拟内存空间中

        3
  •  1
  •   Community Mohan Dere    9 年前

    @cnicutar关于静态存储的观点是正确的。事实上,关于这一点有一个很好的讨论 in another question 。尽管这个问题的标题是,但那里的答案(尤其是前两个)确实很好地回答了你的问题,我认为我做得再好不过了。

        4
  •  0
  •   Science_Fiction    14 年前

    如前所述,每个线程都有自己的堆栈。因此,这个堆栈上的数据被认为是线程安全的,因为只有它拥有它。

    All threads within a process have access to the same data (share)
    

    正如它所暗示的,多个线程可以访问相同的数据。这应该会敲响一些小警钟,因为您必须开始考虑线程同步(关键部分、互斥体等)到共享资源。

    由于所有线程都可以访问同一堆,因此通过新操作符在堆上分配的资源是共享的。

        5
  •  0
  •   Yogesh    14 年前

    我不认为静态数据会被分配给每个线程。 它将只被实例化一次,并且所有在execute()方法中声明了该静态数据的线程都可以访问它。。

    推荐文章