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他接收他的地址k并可能返回结果,就像您已经ptread_t为每个线程分离变量一样。

于 2013-02-04T16:14:30.260 回答
0

为了避免得到 0 作为输出。将 pi=pi+sumvalue 放入 join for 循环中。因为当 sumvalue 非常小时且 pi=0 时 pi=pi+sumvalue 只执行一次。pi=0 是输出。只需将 pi=pi+sumvalue 放在 join for 循环中。

要获得一致的 pi 值,请遵循以下提到的详细信息。

您必须确保有两个想法:-

  1. 只需将 pi 作为全局变量并删除所有全局变量。限制使用许多全局变量,因为更新它们将成为关键部分。将 pi 更新为

pthread 互斥锁(&mutex1);

pi += pi + 我的总和;

pthread 互斥锁解锁(&mutex1);

  1. 您还可以将 sum_values 计算为: void pie_function(void rank) {

    long my_rank =(长)排名;

//printf("%ld \n",my_rank);

双倍因子,总和 = 0.0;

长长我;

长长n=1000000;

long long my_n = n/thread_count;

长长 my_first_i = my_n*my_rank;

长长的 my_last_i = my_first_i + my_n;

如果 (my_first_i % 2 == 0) 因子 = 1.0;

否则因子 = -1.0;

for (i = my_first_i; i < my_last_i; i++, factor = -factor) sumvalue+= 4 factor/(2 i+1);

pthread_exit(&sumvalue);
}

于 2021-07-31T04:24:54.747 回答