Я пытаюсь создать сценарий, который может вычислять число пи с использованием 4 потоков и функции клона, но функция никогда не используется должным образом.
Код выполняет почти все, что ему было сказано, но не то, что функция должна делать, где она присваивает pid = clone(&clonefunc
... Я перепробовал все, что мог придумать.
Я действительно не знаю почему, это код:
* * РЕДАКТИРОВАТЬ: я сделал несколько предложенных изменений, но значение Pi по-прежнему не меняется для каждого потока, в итоге они остаются одинаковыми, даже если в конце число правильное (до 9 цифр)
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <time.h>
#include <sys/time.h>
#include <sched.h>
#include <signal.h>
#define iterations 2000000000
#define NCLONES 4
static double pi[NCLONES];
int clonefunc(void* args){
int clon_num = *((int *) args);
printf("clon_num: %d\n",clon_num);
int i;
double inicio = clon_num*(iterations/NCLONES);
double fin = (clon_num +1)*(iterations/NCLONES);
printf("inicio: %f\tfin: %f",inicio,fin);
for(i = inicio ; i < fin ; i++){
if (i % 2)pi[clon_num] -= 1.0/(2*i+1);
else pi[clon_num] += 1.0/(2*i+1);
}
printf("\nPi: %.9lf\n",*pi);
return 0;
}
int main(){
int i;
int clonearray[NCLONES];
double pi_total = 0;
pid_t pid;
long long start_ts;
long long stop_ts;
long long elapsed_time;
struct timeval ts;
void* stack[NCLONES];
gettimeofday(&ts, NULL);
start_ts = ts.tv_sec;
for(i=0 ; i<NCLONES ; i++){
printf("se crea el clon %d \n " , i);
clonearray[i]=i;
stack[i] = malloc(1024*64);
pid = clone(&clonefunc, (void*)(stack[i] + (1024*64)), SIGCHLD | CLONE_FS | CLONE_FILES |
CLONE_SIGHAND | CLONE_VM, &i);
wait(NULL);
}
for(i=0 ; i<NCLONES ; i++){
pi_total+=pi[i];
free(stack[i]);
}
gettimeofday(&ts, NULL);
stop_ts = ts.tv_sec;
elapsed_time = stop_ts-start_ts;
printf("----------------------------\n Valor de pi : %.9f \n",(pi_total*4));
printf("Tiempo total = %d segundos \n ----------------------------\n",(int)elapsed_time);
return 0;
}
Показы исполнения:
se crea el clon 0 clon_num: 0 inicio: 0.000000 fin: 500000000.000000 Pi: 0.785398163
se crea el clon 1 clon_num: 1 inicio : 500000000.000000 плавник: 1000000000.000000 Pi: 0,785398163
se crea el clon 2 clon_num: 2 inicio: 1000000000.000000 плавник: 1500000000.000000 Pi: 0,785398163
1024 Crea El Clon 3 clon_num: 3 inicio: 15 00000000.000000 плавник: 2000000000.000000
Пи: 0,785398163
Доблесть Пи: 3,141592659 Итого по времени = 16 секундо