用于pthread的malloc内存然后是fork + execvp

时间:2014-09-16 09:55:23

标签: c memory-management pthreads exec fork

我得到一个事件,并根据该事件我做了一些处理,然后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时,我从堆中分配内存。我在哪里可以释放这个内存并将其释放回堆中。没有做任何事情看起来像是内存泄漏给我。

我在这里尝试通常是做什么的 - 首先运行多个pthreads并在每个pthread中执行fork + execvp

1 个答案:

答案 0 :(得分:1)

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

关于第二个问题,只需使用以下内容即可避免堆内存分配:
 pthread_t work_threads[MAX_FORKS_ALLOWED];

关于你的第三个问题,正如约阿希姆所说,fork在一个线程中并不常见;实际上也有点危险。 Think before you mix them