2009-09-04 42 views
6

Làm thế nào để bạn sử dụng lệnh fork() theo cách sao cho bạn có thể sinh ra 10 tiến trình và làm cho chúng thực hiện một nhiệm vụ nhỏ đồng thời.Nhiều ngã ba() Đồng thời

Đồng thời là từ tác dụng, nhiều nơi hiển thị cách sử dụng ngã ba chỉ sử dụng một cuộc gọi đến ngã ba() trong bản trình diễn của họ. Tôi nghĩ rằng bạn sẽ sử dụng một số loại vòng lặp nhưng tôi đã cố gắng và có vẻ như trong các bài kiểm tra của tôi rằng fork() đang sinh ra một quy trình mới, làm việc, sau đó sinh ra một quy trình mới. Vì vậy, họ xuất hiện để được chạy tuần tự, nhưng làm thế nào tôi có thể ngã ba đồng thời và có 10 quy trình làm công việc đồng thời nếu điều đó có ý nghĩa?

Cảm ơn.

Cập nhật: Cảm ơn bạn đã trả lời câu hỏi, tôi nghĩ rằng tôi chỉ hiểu lầm một số khía cạnh của ngã ba() ban đầu nhưng tôi hiểu nó ngay bây giờ. Chúc mừng.

+2

BTW-- Bạn có thực sự * * muốn quá trình (như trong văn bản của bạn) hoặc chủ đề (như trong thẻ của bạn). Nếu các quy trình mà bạn muốn là [multiprocessing] – dmckee

+0

, bạn có đúng là –

Trả lời

15

Gọi fork() trong một vòng lặp:

Thêm mã để chờ đợi cho trẻ em một cảm:

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); 
+1

Tôi muốn viết 'break -> exit' –

+2

oh chắc chắn nhất. Bạn đang mời một quả bom ngã ba giới hạn khác. –

+0

Cảm ơn vì đã phát hiện ra điều đó. Tôi đã cập nhật. –

3

Chỉ cần vòng lặp trong quá trình "chính" sinh sản một đứa trẻ khác với mỗi người chỉ định một nhiệm vụ cụ thể.

4

Khi bạn ngắt kết nối, quá trình sẽ chạy đồng thời. Nhưng lưu ý rằng trừ khi bạn có đủ bộ xử lý không hoạt động, chúng có thể không thực sự đồng thời thực hiện, điều này không thực sự quan trọng ...

Đoạn thứ hai của bạn có vẻ như bạn không hiểu cách hoạt động của ngã ba, bạn có để kiểm tra mã trả lại để xem bạn có đang ở trong cấp độ gốc hoặc trong quá trình được chia nhỏ hay không. Vì vậy, bạn sẽ có cha mẹ chạy một vòng lặp để ngã ba ra 10 quy trình, và ở trẻ em bạn làm bất cứ điều gì bạn muốn làm đồng thời.

0

Bạn cũng có thể muốn xem xét POSIX Chủ đề (hoặc pthreads). Đây là một hướng dẫn:

https://computing.llnl.gov/tutorials/pthreads/

+0

Tôi biết cách hoạt động của pthreads mà tôi đã tự mã hóa trước đó ..... không phải những gì tôi cần –

Các vấn đề liên quan