Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用P处理器计算整数数组的元素之和_C_Linux - Fatal编程技术网

C 如何使用P处理器计算整数数组的元素之和

C 如何使用P处理器计算整数数组的元素之和,c,linux,C,Linux,我必须使用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

我必须使用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;

}
#包括
#包括
#包括
#包括
#定义第17页
#定义尺寸153
静态pid_t id[P];
静态整数元素列表[]={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){
整数和=0;
int i;
对于(i=开始;i<大小;i+=步长){
sum+=elemList[i];
}
写入(wPipe和sum,sum的大小);
}
int main(){
int-fd[2];
int-total=0;
int结果;
整数字节;
int i;
管道(fd);
对于(i=0;i0){
printf(“管道上的东西。\n”);
总数+=结果;
}否则{
printf(“管道上没有任何内容。\n”);
}
}   
对于(i=0;i

我做得对吗?

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

您的程序读取的字节数可能少于子程序写入的字节数

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

我不确定,但您可能需要重试
wait()
调用
EINTR
错误;否则您将创建僵尸

你不需要杀掉


查看比较。

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

您的程序读取的字节数可能少于子程序写入的字节数

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

我不确定,但您可能需要重试
wait()
调用
EINTR
错误;否则您将创建僵尸

你不需要杀掉


查看以进行比较。

运行它时会发生什么?它会产生正确的结果吗?我已经对定义的数组进行了测试,结果是正确的。我不知道在其他情况下会发生什么,例如,如果数组有大量元素或进程数较大,这是您的程序的有力证据很好。除了缺少一个括号(我认为这是一个复制粘贴错误)之外,我看不出代码有任何错误。也许可以在代码中添加一些错误检查?另外,
kill()
似乎没有必要。至于不知道在其他情况下会发生什么,只需测试其他情况,您就会知道。这方面的最终测试是性能和可伸缩性。如果您将规模扩大到100万个元素(您必须动态分配阵列),它仍然有效吗?如果改变进程数P,是否会以预期的方式影响性能?(在
时间
下运行程序)当你运行它时会发生什么?它会产生正确的结果吗?我已经对定义的数组进行了测试,结果是正确的。我不知道在其他情况下会发生什么,例如,如果数组有大量的元素或进程,这是你的程序很好的有力证据。除了缺少括号(我假设是一个复制粘贴错误)我看不出代码有任何错误。也许可以在代码中添加一些错误检查?另外,
kill()
似乎没有必要。至于不知道在其他情况下会发生什么,只需测试其他情况,您就会知道。这方面的最终测试是性能和可伸缩性。如果您将规模扩大到100万个元素(您必须动态分配阵列),它仍然有效吗?如果改变进程数P,是否会以预期的方式影响性能?(在
时间
下运行程序)