【问题标题】:Heap in multi-threaded environment多线程环境中的堆
【发布时间】:2013-06-24 10:17:21
【问题描述】:

在多线程环境中堆是如何管理的?

  • 它是在线程之间共享还是每个线程都有其独立的堆?
  • 如果两者都可行,那么推荐哪种方法?

【问题讨论】:

  • 在什么操作系统中?什么语言?什么运行环境?
  • 也检查this

标签: multithreading


【解决方案1】:

堆可以由互斥体共享和保护。这是最简单的解决方案,在大多数情况下都能很好地工作。

您可以为每个线程创建一个堆,但是您必须决定是允许从任何线程进行释放还是仅从进行分配的线程进行释放。无论哪种方式,它都会变得非常多毛。如果您有大量线程和大量分配,这可能是一个更具可扩展性的解决方案。

【讨论】:

  • 实际上私有堆不是一个坏主意。随之而来的含义是您不能在线程之间共享内存。然后,您必须通过显式 IPC(管道等)共享数据。然后这变得更像 CSP,这是避免死锁、活锁等的好方法。所以不是一个坏主意......
  • 是的,这是真的。传统意义上的线程可以访问彼此的数据,但如果您删除该要求,您可以让事情变得更加简洁。
  • @Minthos:通用问题的通用解决方案。
【解决方案2】:

pthreads

来自man page

一个进程可以包含多个线程,所有线程都是 执行相同的程序。这些线程共享相同的全局内存 (数据和堆段),但每个线程都有自己的堆栈(自动 变量)。

所有线程的堆都是相同的,但访问取决于用于访问分配内存的变量的范围。

void* thFn(void*)
{
  char* c = new char[5];
  //etc
  delete[] c;
}

在这种情况下,内存将分配在堆上。但是c 对于每个 pthread 来说都是本地的。如果允许其他pthreads 可以从该位置读取(检索正确的值,直到分配它的线程释放内存)(如果他们以某种方式获得地址)。

【讨论】:

    猜你喜欢
    • 2018-05-10
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多