你怎麼這樣,你可以生成10個進程,讓他們做一個小任務並行的方式使用fork()的命令。多fork()的併發
併發是最關鍵的詞,很多地方顯示如何使用叉只使用一個調用fork()在他們的演示。我以爲你會使用某種for循環,但我嘗試過,似乎在我的測試中,fork()產生了一個新進程,做了工作,然後產生了一個新進程。所以它們似乎是按順序運行的,但是如何才能同時進行分叉操作並讓10個進程同時進行工作?
謝謝。
更新:感謝您的答案,我想我剛剛誤解了fork()的某些方面,但現在我明白了。乾杯。
你怎麼這樣,你可以生成10個進程,讓他們做一個小任務並行的方式使用fork()的命令。多fork()的併發
併發是最關鍵的詞,很多地方顯示如何使用叉只使用一個調用fork()在他們的演示。我以爲你會使用某種for循環,但我嘗試過,似乎在我的測試中,fork()產生了一個新進程,做了工作,然後產生了一個新進程。所以它們似乎是按順序運行的,但是如何才能同時進行分叉操作並讓10個進程同時進行工作?
謝謝。
更新:感謝您的答案,我想我剛剛誤解了fork()的某些方面,但現在我明白了。乾杯。
呼叫fork()
在一個循環:
添加代碼等待每個評論的孩子:
int numberOfChildren = 10;
pid_t *childPids = NULL;
pid_t p;
/* Allocate array of child PIDs: error handling omitted for brevity */
childPids = malloc(numberOfChildren * sizeof(pid_t));
/* Start up children */
for (int ii = 0; ii < numberOfChildren; ++ii) {
if ((p = fork()) == 0) {
// Child process: do your work here
exit(0);
}
else {
childPids[ii] = p;
}
}
/* Wait for children to exit */
int stillWaiting;
do {
stillWaiting = 0;
for (int ii = 0; ii < numberOfChildren; ++ii) {
if (childPids[ii] > 0) {
if (waitpid(childPids[ii], NULL, WNOHANG) != 0) {
/* Child is done */
childPids[ii] = 0;
}
else {
/* Still waiting on this child */
stillWaiting = 1;
}
}
/* Give up timeslice and prevent hard loop: this may not work on all flavors of Unix */
sleep(0);
}
} while (stillWaiting);
/* Cleanup */
free(childPids);
我會寫'破 - > exit' – 2009-09-04 19:37:38
哦最肯定。否則,您會邀請有限的叉形炸彈。 – 2009-09-04 19:43:20
感謝您的發現。我已更新。 – 2009-09-04 19:54:14
在「主」過程中產卵相繼與每個孩子剛回路分配一個特定的任務。
當你分離進程時,將同時運行。但請注意,除非你有足夠的可用空閒的處理器,他們可能不會真的被同時執行,這不應該真正的問題...
你的第二個段落使它看起來就像你根本不瞭解如何叉的作品,你有檢查返回碼以查看您是在父級還是在分叉進程中。所以你應該讓父母運行一個循環來分離10個進程,並且在你的孩子中你可以做任何你想要做的事情。
你也可能想看看POSIX線程(或並行線程)。這裏是一個教程:
我知道pthread是如何工作的我之前編寫了我自己的代碼.....不是我所需要的 – 2009-09-06 16:26:24
BTW--你真的* *要處理(如文本)或線程(在你的標記)。如果進程需要的標籤是[多] – dmckee 2009-09-04 19:32:56
是的,你是正確的 – 2009-09-04 19:49:15