繁体   English   中英

为pthread分配malloc内存,然后派生+ execvp

[英]malloc memory for pthread and then fork + execvp

我收到一个事件,并基于该事件进行一些处理,然后使用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

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

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

关于第三个问题,正如Joachim所说,在线程内fork并不常见; 实际上也有点危险。 三思而后行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM