#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 多线程(九),生产者和消费者问题
猜你喜欢
转载自blog.csdn.net/u012592062/article/details/80470661
今日推荐
周排行