C++ Boost 多线程(九),生产者和消费者问题

#include <iostream>
#include <boost/thread.hpp>

using namespace std;

class Account
{
public:
	Account()
		:balance()
	{

	}

	Account(const double &bal)
		:balance(bal)
	{

	}

	double getBalance() const
	{
		return balance;
	}

	//友元函数
	friend void transfer1(Account &from, Account &to, double amount);
	friend void transfer2(Account &from, Account &to, double amount);

private:
	boost::mutex mutex;
	double balance;
};

//使用lock()和unique_lock
void transfer1(Account &from, Account &to, double amount)
{
	boost::lock(from.mutex, to.mutex);
	boost::unique_lock<boost::mutex> lockFrom(from.mutex, boost::adopt_lock);
	boost::unique_lock<boost::mutex> lockTo(to.mutex, boost::adopt_lock);
	from.balance-=amount;
	to.balance+=amount;
}

//使用lock()和lock_guard
void transfer2(Account &from, Account &to, double amount)
{
	boost::lock(from.mutex, to.mutex);
	boost::lock_guard<boost::mutex> lockFrom(from.mutex, boost::adopt_lock);
	boost::this_thread::sleep(boost::posix_time::seconds(3));
	boost::lock_guard<boost::mutex> lockTo(to.mutex, boost::adopt_lock);
	from.balance-=amount;
	to.balance+=amount;
}

int main()
{
	Account a1(1000.00);
	Account a2(500.00);

	//a1向a2转200
	boost::thread t1(transfer2, boost::ref(a1), boost::ref(a2), 200.00);
	//a2向a1转300
	boost::thread t2(transfer2, boost::ref(a2), boost::ref(a1), 300.00);
	t1.join();
	t2.join();

	cout<<"a1.balance = "<<a1.getBalance()<<endl;
	cout<<"a2.balance = "<<a2.getBalance()<<endl;

	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值