0

bpp メソッドを使用して pi を計算しようとしていますが、結果が 0 になり続けます。全体的なアイデアは、各スレッドがその一部を計算し、各スレッドの合計が join メソッドを使用して合計されることです。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

#define NUM_THREADS     20

void *pi_function(void *p);//returns the value of pi
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; //creates a mutex variable
double pi=0,p16=1;int k=0;
double sumvalue=0,sum=0;


main()
{
    pthread_t threads[NUM_THREADS];  //creates the number of threads NUM_THREADS
    int iret1;   //used to ensure that threads are created properly
    //pthread_create(thread,attr,start_routine,arg)

    int i;
    pthread_mutex_init(&mutex1, NULL);

    for(i=0;i<NUM_THREADS;i++){
        iret1= pthread_create(&threads[i],NULL,pie_function,(void *) i);
        if(iret1){
            printf("ERROR; return code from pthread_create() is %d\n", iret1);
            exit(-1);
        }
    }

    for(i=0;i<NUM_THREADS;i++){
        iret1=pthread_join(threads[i],&sumvalue);
        if(iret1){
            printf("ERROR; return code from pthread_create() is %d\n", iret1);
            exit(-1);
        }

        pi=pi+sumvalue;  //my result here keeps returning 0

    }

    pthread_mutex_destroy(&mutex1);
    printf("Main: program completed. Exiting.\n");
    printf("The value of pi is  : %f\n",pi);

    exit(0);
}

void *pie_function(void * p){
    int rc;
    int k=(int)p;
    sumvalue += 1.0/p16 * (4.0/(8* k + 1) - 2.0/(8*k + 4)
                                          - 1.0/(8*k + 5) - 1.0/(8*k+6));
    pthread_mutex_lock( &mutex1 ); //locks the share variable pi and p16

    p16 *=16;
    rc=pthread_mutex_unlock( &mutex1 );
    if(rc){
        printf("ERROR; return code from pthread_create() is %d\n", rc);
    }
    pthread_exit(&sumvalue); 
}
4

2 に答える 2

0

あなたの目的のために、ミューテックスやその他の複雑な構造を持つ必要はありません。すべてのスレッドが独自のローカル変数で計算するだけです。スレッドごとに変数を分離したのと同じ方法で、スレッドがdouble受信し、結果を返す可能性のある a のアドレスを各スレッドに提供します。kptread_t

于 2013-02-04T16:14:30.260 に答える