请修改使用互量的计算程序,使临界区在for循环内。这个版本的性能与原来的忙等待版本相比如何?我们怎样解释它?
时间: 2023-07-15 20:10:57 浏览: 73
下面是使用互斥量的计算程序,临界区在for循环内:
```c++
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
const int N = 10000000;
int sum = 0;
mutex mtx;
void compute_sum(int start, int end) {
int local_sum = 0;
for (int i = start; i < end; ++i) {
local_sum += i;
}
mtx.lock();
sum += local_sum;
mtx.unlock();
}
int main() {
thread t1(compute_sum, 1, N/4);
thread t2(compute_sum, N/4, N/2);
thread t3(compute_sum, N/2, N*3/4);
thread t4(compute_sum, N*3/4, N);
t1.join();
t2.join();
t3.join();
t4.join();
cout << "The sum of 1 to " << N << " is " << sum << endl;
return 0;
}
```
与忙等待版本相比,使用互斥量的版本会更高效。因为忙等待版本中,线程不断地在while循环中检查标志位,这会占用大量的CPU时间,而在使用互斥量的版本中,线程在竞争到互斥量后,会被挂起,只有在互斥量被释放后才会被唤醒,这样可以更有效地利用CPU时间。
阅读全文