请修改使用互斥量的𝜋计算程序,使临界区在for 循环内。
时间: 2024-12-04 17:29:20 浏览: 12
在使用互斥量(Mutex)来保护π计算程序中的共享资源时,确保临界区(Critical Section)只在一个时间由一个线程访问是很关键的。如果你想让临界区位于`for`循环内部,你需要在每次迭代开始前获取互斥量,并在迭代结束后释放它。下面是一个简单的示例,假设我们在一个多线程环境中计算π:
```c++
#include <iostream>
#include <thread>
#include <mutex> // 包含互斥量
std::mutex pi_mutex; // 创建全局互斥量
const double pi_divisor = 4.0;
double sum = 0.0;
void calculate_pi(int start, int end) {
for (int i = start; i <= end; ++i) {
std::lock_guard<std::mutex> lock(pi_mutex); // 获取互斥量
if (i % 4 == 0 || i % 4 == 1) {
sum += 1.0 / i;
}
}
}
int main() {
const int num_threads = 4; // 假设我们有四个线程
std::vector<std::thread> threads;
int step = pi_divisor / num_threads; // 计算每个线程的工作范围
for (int i = 0; i <= pi_divisor; i += step) {
int start = i;
int end = std::min(i + step - 1, pi_divisor);
threads.push_back(std::thread(calculate_pi, start, end));
}
// 等待所有线程完成
for (auto& thread : threads) {
thread.join();
}
// 由于累加可能会导致浮点数精度损失,所以这里通常会采用一些技巧来准确估算π,比如四舍五入到一定位数
std::cout << "Estimated value of pi: " << round(sum * 4) << std::endl; // 四舍五入近似值
return 0;
}
```
在这个例子中,`calculate_pi`函数的`for`循环在`lock_guard`的作用范围内运行,这确保了在任何时候只有一个线程能更新`sum`变量。
阅读全文