用多线程的方式求圆周率C语言代码
时间: 2024-03-02 16:54:36 浏览: 16
以下是一个使用多线程并行计算圆周率的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD_NUM 4 // 线程数
#define POINTS_PER_THREAD 1000000 // 每个线程生成的点数
int total_points = POINTS_PER_THREAD * THREAD_NUM; // 总点数
int points_in_circle = 0; // 落在圆内的点数
pthread_mutex_t lock; // 互斥锁,用于保证数据一致性
void *monte_carlo(void *arg) {
int i, count = 0;
double x, y;
unsigned int seed = rand();
for (i = 0; i < POINTS_PER_THREAD; i++) {
x = (double) rand_r(&seed) / RAND_MAX * 2 - 1;
y = (double) rand_r(&seed) / RAND_MAX * 2 - 1;
if (x * x + y * y <= 1) {
count++;
}
}
pthread_mutex_lock(&lock);
points_in_circle += count;
pthread_mutex_unlock(&lock);
pthread_exit(NULL);
}
int main() {
int i, ret;
pthread_t threads[THREAD_NUM];
// 初始化互斥锁
pthread_mutex_init(&lock, NULL);
// 创建线程
for (i = 0; i < THREAD_NUM; i++) {
ret = pthread_create(&threads[i], NULL, monte_carlo, NULL);
if (ret) {
printf("Error: 创建线程失败\n");
exit(-1);
}
}
// 等待线程完成
for (i = 0; i < THREAD_NUM; i++) {
pthread_join(threads[i], NULL);
}
// 计算圆周率
double pi = 4.0 * points_in_circle / total_points;
printf("圆周率的估计值为 %f\n", pi);
// 销毁互斥锁
pthread_mutex_destroy(&lock);
return 0;
}
```
在该代码中,首先定义了线程数和每个线程生成的点数,然后计算出总点数和落在圆内的点数。接着,定义了互斥锁 `lock`,用于保证数据的一致性。在 `monte_carlo` 函数中,生成指定数量的随机点,并统计落在圆内的点数,最后使用互斥锁将线程计算出的结果累加到 `points_in_circle` 中。在 `main` 函数中,创建多个线程并等待它们完成,最后计算估计的圆周率。