2016-02-28 82 views
0

我在共享內存中獲得了一個帶有n個柱的整數矩陣,所以我創建了n個進程,每個進程創建一個柱的總和。問題是它們不能並行執行。還有就是代碼(這實際上並沒有做的總和,是測試):fork()創建的進程不會並行執行

int pid2[n]; 
    i=0; 
    do{ 
     pid2[i] = fork(); 
     if(pid2[i]==-1) printf("fork() fail!\n"); 
     else if(pid2[i]==0){ 
     printf("Start process %d \n", i); 
     sleep((rand() % 50)/10); 
     printf("Process %d terminated" ,i); 
     }   
     else i++; 
     } 
    while(i<n&&pid2[i]>0); 

什麼,我得到的是,它在這個訂單處理3,2,1運行,並以相同的順序結束時,總是。但睡眠是隨機的,所以到達時間應該是隨機的!另外,我不明白爲什麼它從進程3開始。

回答

2

你的代碼是錯誤的,不這樣做你的想法。

fork()成功的情況下,調用者遞增i,然後while的最終測試爲false,因此原始進程終止。當新進程執行代碼「start 0」,「terminate 0」時,然後跳轉到真正的測試,然後再次分叉等等。所以你的進程總是以相同的順序一個接一個地產生。

以下是更正代碼(隨機種子):

int pid2[n]; 
i=0; 
do{ 
    pid2[i] = fork(); 
    if(pid2[i]==-1) printf("fork() fail!\n"); 
    else if(pid2[i]==0){ 
    printf("Start process %d \n", i); 
    sleep((rand() % 50)/10); 
    printf("Process %d terminated" ,i); 
    exit(0); // ends the child 
    }   
    else i++; 
    } 
while(i<n&&pid2[i-1]>0); // test is last pid is correct 
+0

父'仍然執行'while(我 0)''後'我'增加了這是錯誤的。 'pid [i]'在這一點上還沒有初始化。 –

+0

是的,我忘記糾正代碼中的那一點...完成。 –

1

當您沒有使用srandom函數種子隨機數生成器時,您將始終獲得相同序列的「隨機」數字。通常你會撥打srandom(time(NULL))

檢查這個簡單的程序:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    printf("%d\n", rand()); 
    return 0; 
} 

在我的電腦總是輸出1804289383

此外,當您在您的孩子的過程稱之爲rand總是繼承隨機數生成機器的父母的狀態,讓您的孩子將永遠產生相同隨機數。在分叉之前你應該產生這個隨機數。在下面的代碼的所有兒童返回相同的隨機值:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/wait.h> 

#define CHILDREN 3 

int main(void) { 
    int i; 
    for (i = 0; i < CHILDREN; ++i) { 
     if (fork() == 0) { 
      printf("rand is %d in child %d\n", rand(), i); 
      return 0; 
     } 
     wait(NULL); 
    } 

    return 0; 
} 

最後一件事是,創造一些工藝單後,另一個並不意味着他們將得到的處理器時間的順序。當你的第一個孩子fork完全沒問題時,處理器的上下文將返回給父母,他將執行另一個fork,然後處理器的上下文將被分配給第二個孩子,而不是第一個孩子。

的作品

代碼:

#include <time.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/wait.h> 

#define CHILDREN 3 
int main(void) { 
    int pid, i, children = 0; 
    srand(time(NULL)); 
    double sleeptime; 
    for (i = 0; i < CHILDREN; ++i) { 
     sleeptime = (rand() % 50)/10.0; 
     pid = fork(); 
     if (pid == -1) { 
      perror("fork failed"); 
     } else if (pid == 0) { 
      printf("Child %d crated\n", i); 
      fflush(stdout); 
      sleep(sleeptime); 
      printf("Child %d terminated\n", i); 
      fflush(stdout); 
      return 0; 
     } else { 
      ++children; 
     } 
    } 

    // wait for all childredn 
    for (i = 0; i < children; ++i) { 
     wait(NULL); 
    } 

    return 0; 
} 
+0

我用srandom,仍然得到同樣的數量。仍然我沒有得到它爲什麼從過程3開始,而不是1. – alteration

+0

@alteration:擴展我的答案 – nsilent22