下面是一个信号量机制的例题:假设有一个银行账户,初始金额为1000元。现在有两个进程同时操作该账户,一个进程是存钱进账户,另一个进程是取钱出账户。为了保证操作的安全性,需要使用信号量机制来同步两个进程对账户的访问。当取钱操作发现账户余额不足时,它会等待`cv`条件变量,直到存钱操作完成后通过`cv.notify_all()`唤醒等待的线程。这个例题演示了如何使用信号量机制来保证多个进程对共享资源的安全访问,避免数据竞争等问题。
信号量机制是操作系统中用来同步和互斥访问共享资源的一种方法。它使用一个计数器来控制对资源的访问,当计数器的值大于0时表示资源可用,其他进程可以访问;当计数器的值等于0时表示资源不可用,其他进程需要等待。
下面是一个信号量机制的例题:
假设有一个银行账户,初始金额为1000元。现在有两个进程同时操作该账户,一个进程是存钱进账户,另一个进程是取钱出账户。为了保证操作的安全性,需要使用信号量机制来同步两个进程对账户的访问。
```c++
#include
#include
#include
#include
using namespace std;
mutex mtx;
condition_variable cv;
int account = 1000;
void depositMoney(int amount) {
unique_lock
account += amount;
cout << "Deposit " << amount << " yuan. Account balance: " << account << " yuan." << endl;
cv.notify_all();
}
void withdrawMoney(int amount) {
unique_lock
if (account < amount) {
cv.wait(lock, [&]{ return account >= amount; });
}
account -= amount;
cout << "Withdraw " << amount << " yuan. Account balance: " << account << " yuan." << endl;
}
int main() {
thread thread1(depositMoney, 500);
thread thread2(withdrawMoney, 200);
thread1.join();
thread2.join();
return 0;
}
```
在上面的例子中,`depositMoney()`函数用来存钱进账户,`withdrawMoney()`函数用来取钱出账户。两个函数都是通过互斥锁`mtx`来同步对账户的访问。当取钱操作发现账户余额不足时,它会等待`cv`条件变量,直到存钱操作完成后通过`cv.notify_all()`唤醒等待的线程。
这个例题演示了如何使用信号量机制来保证多个进程对共享资源的安全访问,避免数据竞争等问题。