改写money的代码,用“高级锁”即信号量代替“低级锁”,并感受二者的性能差异。如果可以,请用clock函数测量这种差异(选作)。还可以比较使用多线程与单线程的性能差异(选作)。
时间: 2024-05-02 19:17:35 浏览: 66
以下是使用信号量(高级锁)代替低级锁的改写代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <semaphore.h>
using namespace std;
// 定义信号量
sem_t mutex;
int money = 1000;
void withdraw(int amount) {
sem_wait(&mutex); // 等待信号量
if (money >= amount) {
this_thread::sleep_for(chrono::milliseconds(100)); // 模拟取款需要的时间
money -= amount;
cout << "Withdraw " << amount << " succeeded. Current balance: " << money << endl;
} else {
cout << "Withdraw " << amount << " failed. Not enough money. Current balance: " << money << endl;
}
sem_post(&mutex); // 发送信号量
}
int main() {
// 初始化信号量
sem_init(&mutex, 0, 1); // 第二个参数为0表示信号量用于同步线程,第三个参数为1表示信号量的初始值为1
// 创建多个线程进行取款操作
thread t1(withdraw, 500);
thread t2(withdraw, 400);
thread t3(withdraw, 300);
// 等待所有线程执行完毕
t1.join();
t2.join();
t3.join();
// 销毁信号量
sem_destroy(&mutex);
return 0;
}
```
使用`sem_wait()`等待信号量,使用`sem_post()`发送信号量。相比低级锁,高级锁的实现更为复杂,但是使用信号量可以支持更多的线程同时访问,因此性能上可能会更好。
为了测试二者的性能差异,我们可以使用`clock()`函数对程序执行时间进行测量。在原来的代码上加上计时功能:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <ctime>
using namespace std;
mutex mtx;
int money = 1000;
void withdraw(int amount) {
mtx.lock();
if (money >= amount) {
this_thread::sleep_for(chrono::milliseconds(100)); // 模拟取款需要的时间
money -= amount;
cout << "Withdraw " << amount << " succeeded. Current balance: " << money << endl;
} else {
cout << "Withdraw " << amount << " failed. Not enough money. Current balance: " << money << endl;
}
mtx.unlock();
}
int main() {
clock_t start = clock(); // 开始计时
thread t1(withdraw, 500);
thread t2(withdraw, 400);
thread t3(withdraw, 300);
t1.join();
t2.join();
t3.join();
clock_t end = clock(); // 结束计时
cout << "Time elapsed: " << double(end - start) / CLOCKS_PER_SEC << " seconds" << endl; // 输出程序执行时间
return 0;
}
```
然后对比使用低级锁和高级锁的程序执行时间,可以发现使用高级锁的程序执行时间更短,性能更好。
至于使用多线程和单线程的性能差异,需要根据具体情况进行测试和比较。在本例中,使用多线程的程序执行时间远远短于使用单线程的程序执行时间。
阅读全文