筛质数进阶
之前筛质数程序创建了201个子进程,由于进程号有限,所以可以采用以下三种方法
1、分块法:将201个子进程分成N等份。eg:N=3,那么201个子进程平均分成3份
2.交叉分配法:将201个子进程依次分配给N个进程
3.进程池:用一个进程取质数,并将其丢给下边的线程或者进程处理质数
=====================================================================
交叉分配法:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #define LEFT 30000000 #define RIGHT 30000200 #define N 3 int main(void) { int i , j , mark , n; pid_t pid ; for(n = 0 ; n < N ; n++) { //1.父进程创建3个子进程 pid = fork(); //2.失败判断(并不完善) if(pid < 0) { perror("fork()");//需要将之前fork的释放 exit(1); } //3.子进程 if(pid == 0) { for(i = LEFT+n ; i <= RIGHT ; i+=N) { mark = 1 ; for(j = 2 ;j < i/2 ; j++) { if(i % j == 0) { mark = 0 ; break; } } if(mark) printf("[%d]%d is a primer\n",n,i); } exit(0); } } //4.收尸 for(n = 0 ; n < N ; n++) wait(NULL); exit(0); }
结果:
[1]30000001 is a primer [2]30000023 is a primer [1]30000037 is a primer [2]30000041 is a primer [2]30000059 is a primer [1]30000049 is a primer [1]30000079 is a primer [2]30000071 is a primer [1]30000109 is a primer [2]30000083 is a primer [1]30000133 is a primer [2]30000137 is a primer [1]30000163 is a primer [2]30000149 is a primer [1]30000169 is a primer [2]30000167 is a primer [1]30000193 is a primer [1]30000199 is a primer
============================================================================
时间: 2024-11-10 08:14:15