#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;
}
C++ Boost 多线程(九),生产者和消费者问题
最新推荐文章于 2020-03-10 11:06:58 发布