1

我必须使用 P 处理器添加整数数组的元素。下面是我到目前为止编写的代码。我已经定义了一个数组和一些 4 个处理器来进行一些测试。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#define P 17
#define SIZE 153

static pid_t id[P];
static int elementsList[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
            1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
            1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
            1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
            1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
            1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
            1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
            1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
            1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
            };

void getSubvectorSum(int elemList[], int start, int step, int size,int wPipe){
int sum = 0;
int i;
for(i = start; i < size; i += step){
    sum += elemList[i];
}
write(wPipe,&sum,sizeof sum);
}

int main(){
int fd[2];
int total = 0;
int result;
int nbytes;
int i;
pipe(fd);
for(i = 0; i < P; i++){
    id[i] = fork();
    if(id[i] == 0){
                    close(fd[0]);
        getSubvectorSum(elementsList,i,P,SIZE,fd[1]);
        exit(0);
    }
}
for(i = 0; i < P; i++){
    wait(NULL);
}
close(fd[1];
for(i = 0; i < P; i++){
    nbytes = read(fd[0],&result,sizeof result);
    if(nbytes > 0){
        printf("Something on the pipe.\n");
        total += result;

    } else {
        printf("Nothing on the pipe.\n");
    }
}   
for(i = 0; i < P; i++){
    kill(id[i],SIGKILL);
}
printf("total result: %d\n",total);
return 0;

}

我做的事情对吗?

4

1 回答 1

1

您的程序可能会因大量进程而死锁:一旦管道缓冲区已满,子进程将阻塞,write()而父进程将阻塞wait()。在不等待子进程完成的情况下排空父进程中的管道。

您的程序可能读取的字节数少于儿童写入的字节数。

检查系统调用的错误情况。它可能更容易发现错误。

我不确定,但您可能需要重试错误wait()调用EINTR;否则你会制造僵尸。

你不应该需要kill

查看parallel-sum-fork.cparallel-sum-openmp.c进行比较。

于 2013-11-12T20:02:58.710 回答