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;
}

猜你喜欢

转载自blog.csdn.net/u012592062/article/details/80470661