【发布时间】:2023-02-05 14:30:49
【问题描述】:
从命令行参数中获取名为 m & n 的两个值并将它们转换为整数。现在之后创建 m 个线程,每个线程计算 Gregory-Leibniz 级数中 n/m 项的总和。
pi = 4 * (1 - 1/3 + 1/5 - 1/7 + 1/9 - ...)
现在,当线程完成其计算时,打印其部分总和并将其自动添加到共享全局变量中。
以及如何检查所有 m 个计算线程是否都完成了原子加法?
我分享我的源代码,我尝试过的
#include<stdio.h>
#include<pthread.h>
#include <stdlib.h>
#include<math.h>
pthread_barrier_t barrier;
int count;
long int term;
// int* int_arr;
double total;
void *thread_function(void *vargp)
{
int thread_rank = *(int *)vargp;
// printf("waiting for barrier... \n");
pthread_barrier_wait(&barrier);
// printf("we passed the barrier... \n");
double sum = 0.0;
int n = count * term;
int start = n - term;
// printf("start %d & end %d \n\n", start, n);
for(int i = start; i < n; i++)
{
sum += pow(-1, i) / (2*i+1);
// v += 1 / i - 1 / (i + 2);
}
total += sum;
// int_arr[count] = sum;
count++;
printf("thr %d : %lf \n", thread_rank, sum);
return NULL;
}
int main(int argc,char *argv[])
{
if (argc <= 2) {
printf("missing arguments. please pass two num. in arguments\n");
exit(-1);
}
int m = atoi(argv[1]); // get value of first argument
int n = atoi(argv[2]); // get value of second argument
// int_arr = (int*) calloc(m, sizeof(int));
count = 1;
term = n / m;
pthread_t thread_id[m];
int i, ret;
double pi;
/* Initialize the barrier. */
pthread_barrier_init(&barrier, NULL, m);
for(i = 0; i < m; i++)
{
ret = pthread_create(&thread_id[i], NULL , &thread_function, (void *)&i);
if (ret) {
printf("unable to create thread! \n");
exit(-1);
}
}
for(i = 0; i < m; i++)
{
if(pthread_join(thread_id[i], NULL) != 0) {
perror("Failed to join thread");
}
}
pi = 4 * total;
printf("%lf ", pi);
pthread_barrier_destroy(&barrier);
return 0;
}
我需要的 :-创建 M 个线程,每个线程计算 Gregory-Leibniz 级数中 n/m 项的总和。
第一个线程计算项 1 到 n/m 的总和,第二个线程计算从 (n/m + 1) 到 2n/m 等项的总和。
当所有线程完成计算时,打印其部分总和和 Pi 的值。
我尝试了很多,但我无法准确地实现我想要的。我得到错误的 PI 输出值
例如:m = 16 和 n = 1024
然后它有时返回 3.125969,有时返回 12.503874,15.629843,有时返回 6.251937 作为 Pi 值的输出
请帮我
【问题讨论】:
-
题外话:你认为
atoi()在非整数的情况下会返回什么?你为什么要从void *投射到int *?这是不必要的,那里有一个隐式转换。“打印其部分总和并将其自动添加到共享全局变量中。”----> 所以你需要一个全局变量,但我没有看到。 -
void *thread_function(void *vargp)暗示你应该返回一个指针,但你没有,所以程序会有未定义的行为。使用return NULL;(或pthread_exit(NULL);)结束您的 phtread 函数。 -
“你能帮我解决上面的问题吗”- 什么是你的具体问题?“如何检查所有 m 个计算线程都完成了原子加法?”?你没有做任何添加。
-
同样,这太广泛了。我们在这里回答有关特定问题的问题。您还没有展示您是如何尝试实现这一点的,因此我们看不到您遇到的问题。您已经证明您知道如何启动和加入线程,仅此而已。
-
好的,首先要找到一个教程,然后尝试按照该教程进行操作。
pthread如果您对此不确定,那么示例很多。我敢肯定,在某个地方也有关于如何计算 Gregory-Leibniz 级数中 n/m 项之和的示例。然后,如果您遇到任何问题,您将有一个具体问题要问。
标签: c multithreading pthreads pi