[英]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.