Функция клона не работает в c -> pid = clone (& clonefun c, (void *) (stack [i] + (1024 * 64)), ... НЕТ работы - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь создать сценарий, который может вычислять число пи с использованием 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 секундо


...