请修改使用互斥量的计算程序,使临界区在for循环内。这个版本的性能与原来的忙等待版本相比 如何?我们怎样解释它?
时间: 2023-07-14 12:14:13 浏览: 78
修改后的代码如下:
```c++
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
const int N = 100000000;
double sum = 0;
mutex mtx;
void func(int start, int end) {
double localSum = 0;
for (int i = start; i <= end; i++) {
localSum += 1.0 / i;
}
mtx.lock();
sum += localSum;
mtx.unlock();
}
int main() {
int numThreads = thread::hardware_concurrency();
thread t[numThreads];
int chunkSize = N / numThreads;
for (int i = 0; i < numThreads; i++) {
t[i] = thread(func, i * chunkSize + 1, (i + 1) * chunkSize);
}
for (int i = 0; i < numThreads; i++) {
t[i].join();
}
cout << "sum: " << sum << endl;
return 0;
}
```
这个版本的性能相较于原来的忙等待版本应该更好。因为原来的忙等待版本会在临界区外不断地检查锁是否可用,这会造成CPU资源的浪费。而使用互斥量的版本可以保证线程在临界区内没有竞争时才会获得锁,从而避免了CPU资源的浪费,提高了程序的效率。但是,在for循环内使用互斥量可能会导致锁的竞争更加激烈,因此需要根据实际情况进行测试和选择。
阅读全文