(2)利用忙等待、互斥量及条件变量来编写求∏值的Pthreads程序
时间: 2024-06-11 13:05:06 浏览: 14
以下是使用忙等待、互斥量及条件变量来编写求∏值的Pthreads程序的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREADS 4 // 线程数量
#define ITERATIONS 1000000 // 迭代次数
double pi = 0; // 全局变量,存储最终的π值
pthread_mutex_t pi_mutex; // 互斥量,保护对π值的访问
pthread_cond_t pi_condvar; // 条件变量,用于线程间通信
void *calculate_pi(void *thread_id) {
int i;
double sum = 0.0;
int start = *(int *)thread_id * ITERATIONS / NUM_THREADS;
int end = (*(int *)thread_id + 1) * ITERATIONS / NUM_THREADS;
for (i = start; i < end; i++) {
sum += (i % 2 == 0 ? 1 : -1) * 4.0 / (2 * i + 1);
}
pthread_mutex_lock(&pi_mutex); // 加锁
pi += sum; // 更新π值
pthread_mutex_unlock(&pi_mutex); // 解锁
pthread_cond_signal(&pi_condvar); // 发送条件变量信号
pthread_exit(NULL);
}
int main() {
int i;
pthread_t threads[NUM_THREADS];
int thread_ids[NUM_THREADS];
pthread_mutex_init(&pi_mutex, NULL);
pthread_cond_init(&pi_condvar, NULL);
for (i = 0; i < NUM_THREADS; i++) {
thread_ids[i] = i;
pthread_create(&threads[i], NULL, calculate_pi, (void *)&thread_ids[i]);
}
pthread_mutex_lock(&pi_mutex);
while (pi == 0) { // 忙等待π值被更新
pthread_cond_wait(&pi_condvar, &pi_mutex); // 等待条件变量信号
}
pthread_mutex_unlock(&pi_mutex);
printf("π ≈ %.15g\n", pi);
pthread_mutex_destroy(&pi_mutex);
pthread_cond_destroy(&pi_condvar);
return 0;
}
```
在上述代码中,我们定义了一个全局变量`pi`,用于存储最终的π值。在`calculate_pi`函数中,每个线程都会计算一部分π值,并将计算结果累加到全局变量`pi`中。为了保证对`pi`变量的访问不会出现竞态条件,我们使用了互斥量`pi_mutex`对其进行保护,即在对`pi`变量进行操作时,需要先加锁,操作完成后再解锁。
由于我们需要等待所有线程都计算完π值后才能输出最终结果,因此我们使用了条件变量`pi_condvar`来进行线程间通信。在`main`函数中,我们首先创建了多个线程,并将线程ID传递给`calculate_pi`函数。然后,我们使用互斥量`pi_mutex`对`pi`变量进行加锁,并使用`pthread_cond_wait`函数等待条件变量`pi_condvar`的信号。在`calculate_pi`函数中,每个线程计算完π值后会发送一个条件变量信号,这时`main`函数会被唤醒,从而输出最终结果。
需要注意的是,在使用条件变量等待信号时,需要在互斥量的保护下进行,以避免信号丢失或者竞态条件的发生。因此,在等待条件变量信号之前,我们需要先对互斥量进行加锁,在等待结束后再解锁。在发送条件变量信号时,同样需要先对互斥量进行加锁,以保证信号发送的原子性。
最后,我们需要在程序结束时销毁互斥量和条件变量,以释放资源。这可以通过调用`pthread_mutex_destroy`和`pthread_cond_destroy`函数来完成。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)