请修改使用互斥量的w计算程序,使临界区在for循环内。这个版本的性能与原来的忙等待版本相比如何?我们怎样解释它?
时间: 2023-07-15 13:10:45 浏览: 79
互斥对象锁和临界区锁性能比较
下面是使用互斥量的w计算程序,临界区在for循环内:
```c++
#include <iostream>
#include <thread>
#include <mutex>
const int N = 10000000;
double w = 0.0;
std::mutex mutex_w;
void calculate_w(int start, int end) {
for (int i = start; i < end; ++i) {
mutex_w.lock(); // 进入临界区
w += 1.0 / (i * 4.0 + 1.0);
w -= 1.0 / (i * 4.0 + 3.0);
mutex_w.unlock(); // 离开临界区
}
}
int main() {
std::thread t1(calculate_w, 0, N / 2);
std::thread t2(calculate_w, N / 2, N);
t1.join();
t2.join();
std::cout << "w = " << w * 4.0 << std::endl;
return 0;
}
```
这个版本的性能与原来的忙等待版本相比要好得多。这是因为临界区在for循环内部,线程在每次计算w时都只需要获取一次互斥量,而不是像忙等待版本那样不断地获取互斥量,从而减少了线程间的竞争和等待时间,提高了程序的效率。同时,由于互斥量在加锁时可以使线程进入阻塞状态,从而避免了忙等待版本可能出现的空转现象,进一步提高了程序的效率。
因此,使用互斥量的w计算程序,在临界区在for循环内的情况下,比忙等待版本的性能更好,也更加可靠。
阅读全文