簡體   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