案例分析:
实际生活中,如果有一对情侣共用一张银行卡,假如,一个男生去存款,一个女生去取款。女生在取款的时候,男生存款,抢占了取款操作线程。如果不做线程的同步就会导致的结果是,女生取了款但是数据库没有正常将银行卡扣款,而且还将银行账户多增加了余额,这种情况一旦,发生,那么银行就得倒闭,那么如何避免这种情况发生呢?就需要用到线程锁,下面看下具体实现。
如下代码:男生每次存101元,女生每次取100元,最终增长了对应的钱。而这就好比我们生活中的原始积累。
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
//存钱
void Deposit(mutex &m,int &money)
{
//锁的粒度应该尽可能最小化
for (int i = 0; i < 100; i++)
{
m.lock();
money += 101;
m.unlock();
}
}
//取钱
void Withdraw(mutex & m,int &money)
{
for (int i = 0; i < 100; i++)
{
m.lock();
money -= 100;
m.unlock();
}
}
int main()
{
mutex m;
int money = 2000;
cout << "cunrrent money:" << money << endl;
thread tMan(Deposit,ref(m),ref(money));
thread tWoman(Withdraw,ref(m),ref(money));
tMan.join();
tWoman.join();
cout << "final money:" << money << endl;
return 0;
}
输出结果:
cunrrent money:2000
final money:2100
代码分析:
1.存取款为什么要穿引用,一十提升效率,二是不传应用或者地址会直线对参数的副本进行操作,原来的金额没有改变。
2.为什么要调用join,为了避免主线程在子线程执行完之前结束,保证子线程逻辑执行完。
3.lock位置,加载money变量被改变的上下文,保证加锁粒度足够细。
版权声明:本文为weixin_43907175原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。