pthread 的 malloc 内存,然后 fork + execvp

Posted

技术标签:

【中文标题】pthread 的 malloc 内存,然后 fork + execvp【英文标题】:malloc memory for pthread and then fork + execvp 【发布时间】:2014-09-16 09:55:22 【问题描述】:

我收到一个事件,并基于该事件进行一些处理,然后 fork + execvp 一些其他程序(称为 some_jazzy_program)。最初我使用了一个while循环,我做了以下事情:

 while (some condition)
 
      pid = fork();

      if (pid == 0)
      
            do_some_work()

            execvp (some_jazzy_program..);
      
      else 
      
            do_some_bookkeeping();
      
 

这种设计的问题是,如果 do_some_work() 占用大量时间,那么我无法以足够快的速度生成新进程来启动 some_jazzy_program。为了解决这个问题,我开始使用 pthreads:

  pthread_t *work_threads[MAX_FORKS_ALLOWED];

  while (some condition)
  
      work_threads[index] = (pthread_t *) malloc (sizeof (pthread_t));

      pthread_create(work_threads[index], NULL, do_some_good_work, NULL);

      index ++;
  

  void * do_some_good_work (void *arg)
  
      pid = fork();

      if (pid == 0)
      
            do_some_work()

            execvp (some_jazzy_program..);
      
      else 
      
            do_some_bookkeeping();
      
   

这个设计很有效。不过,我有几个问题。

调用 fork + excvp 生成一个新进程。我应该在父程序中的哪里调用 pthread_exit() 。无论我读过什么,我都不一定需要调用 pthread_exit ,因为当它开始执行的工作完成时,线程会自动死亡。在这种情况下,只要我执行 fork + execvp,它就会死掉。

我的另一个问题是 work_threads[index] = (pthread_t *) malloc (sizeof (pthread_t)) -- 我正在做的内存 malloc。当我使用 malloc 时,我从堆中分配内存。我在哪里可以释放此内存并将其释放回堆。什么都不做对我来说似乎是内存泄漏。

我在这里尝试的通常是这样做的——首先运行多个 pthread,然后在每个 pthread 中执行一个 fork + execvp

【问题讨论】:

关于第二个问题,既然分配了内存,为什么干脆分配内存而只拥有一个普通数组? 另外,我认为拥有多个线程,每个线程都执行fork 并不常见。至少如果子进程的运行时间比线程长,则不会。 @JoachimPileborg 我不想使用普通数组,因为在某些情况下我可能最终会做 30-40 个分叉。我不想在堆栈中分配这么高的内存。你是说我永远不能在这里释放 malloc 的内存吗? sizeof(pthread_t) 不是很多,你需要几十万甚至几百万才能填满堆栈。 当您说子进程运行时间比线程长时,我不确定我是否理解您的意思。如果我做一个 fork + execvp (some_other_program) 那么线程运行多长时间都不重要,对吧?就我而言,线程仅在函数 do_some_good_work 完成时才会终止。但是,到那时,我已经分叉了 + execvp'ed。你觉得这有什么问题吗? 【参考方案1】:

关于您的第一个问题,您无需致电pthread_exit。如果您的主程序想要跟踪线程,您可以使用pthread_join 并检查线程的返回状态。

关于你的第二个问题,你可以通过使用避免堆内存分配:pthread_t work_threads[MAX_FORKS_ALLOWED];

关于您的第三个问题,正如 Joachim 所说,fork 在线程内并不常见;其实也有点危险。 Think before you mix them

【讨论】:

以上是关于pthread 的 malloc 内存,然后 fork + execvp的主要内容,如果未能解决你的问题,请参考以下文章

程序中止或退出时是不是释放 pthread_mutex_t*?

malloc():内存损坏

如何使用矩阵作为pthread参数传递结构?

new 和 malloc 的区别 及使用

如何从线程返回结构?

16 malloc 虚拟内存分配的调试