两个或多个线程如何共享它们已分配的堆上的内存?

Lem*_*ism 14 heap multithreading

正如标题所说,两个或多个线程如何共享它们分配的堆上的内存?我一直在考虑它,我无法弄清楚他们是如何做到的.这是我对这个过程的理解,大概我错了.

任何线程都可以通过进行系统调用来添加或删除堆上给定数量的字节,系统调用返回指向此数据的指针,可能是通过写入线程然后可以复制到堆栈的寄存器.因此,两个线程A和B可以根据需要分配尽可能多的内存.但我没有看到线程A如何知道线程B分配的内存位于何处.我也不知道任何一个线程如何知道其他线程堆栈的位置.多线程程序共享堆,我相信,它可以访问彼此的堆栈,但我无法弄清楚如何.

我尝试搜索这个问题,但只发现了特定于语言的版本,这些版本抽象了细节.

编辑:我试图不是语言或操作系统特定,但我正在使用Linux,我从低级别的角度看待它,我想是汇编.

usr*_*usr 13

我对你的问题的解释:线程A如何知道指向内存B的指针正在使用?他们如何交换数据?

答:它们通常以指向公共内存区域的公共指针开头.这允许他们交换其他数据,包括彼此指向其他数据的指针.

例:

  1. 主线程分配一些共享内存并存储其位置 p
  2. 主线程启动两个工作线程,将指针传递p给它们
  3. 工作人员现在可以使用p和处理指向的数据p

在真实语言(C#)中它看起来像这样:

//start function ThreadProc and pass someData to it
new Thread(ThreadProc).Start(someData)
Run Code Online (Sandbox Code Playgroud)

线程通常不会访问彼此的堆栈.一切都从传递给线程过程的一个指针开始.


创建线程是OS功能.它的工作原理如下:

  1. 应用程序使用标准ABI/API调用操作系统
  2. OS分配堆栈内存和内部数据结构
  3. 操作系统"伪造"第一个堆栈帧:它将指令指针设置为ThreadProc并将someData"推送"到堆栈上.我说"伪造"是因为这个第一个堆栈帧不是自然产生的,而是由人工操作系统创建的.
  4. 操作系统安排线程.ThreadProc不知道它已在新堆栈上设置.它只知道someData处于通常的堆栈位置.

这就是someData到达ThreadProc的方式.这是共享第一个初始数据项的方式.步骤1-3由父线程同步执行.4发生在子线程上.