请修改使用互斥量的π计算程序,使临界区在for循环内。这个版本的性能与原来的忙等待版本相比如何?我们怎样解释他?
时间: 2023-06-27 22:07:03 浏览: 134
软件实现互斥进入临界区PPT学习教案.pptx
下面是修改后的使用互斥量的π计算程序:
```c++
#include <stdio.h>
#include <pthread.h>
#define NUM_THREADS 4
#define N 1000000000
double sum[NUM_THREADS] = {0.0};
pthread_mutex_t mutex;
void *compute_pi(void *thread_id) {
long tid = (long)thread_id;
double step = 1.0 / (double)N;
double partial_sum = 0.0;
for (int i = tid; i < N; i += NUM_THREADS) {
double x = (i + 0.5) * step;
partial_sum += 4.0 / (1.0 + x * x);
}
pthread_mutex_lock(&mutex);
sum[tid] = partial_sum;
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
pthread_mutex_init(&mutex, NULL);
for (long i = 0; i < NUM_THREADS; i++) {
pthread_create(&threads[i], NULL, compute_pi, (void *)i);
}
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
double pi = 0.0;
for (int i = 0; i < NUM_THREADS; i++) {
pi += sum[i];
}
pi *= 1.0 / N;
printf("pi = %f\n", pi);
pthread_mutex_destroy(&mutex);
return 0;
}
```
这个版本的性能比原来的忙等待版本要好得多。原因是在for循环内部,每个线程只计算自己负责的部分,并在计算完成后立即将结果存储到共享数组中。这样可以避免不必要的等待和竞争,从而减少了线程之间的竞争和上下文切换的数量。
使用互斥量可以更好地管理线程之间的共享资源,避免了忙等待的缺点。相较于忙等待,使用互斥量的程序在等待时间上更加充分利用了 CPU,因此性能更好。
阅读全文