1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- // Copyright (C) 2010 Vicente Botet
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #include <iostream>
- #include <boost/thread.hpp>
- #include <boost/current_function.hpp>
- class boostThreadLocksTest
- {
- public:
- boost::shared_mutex myMutex;
- //boost::upgrade_lock<boost::shared_mutex> myLock;
- static int firstFunction(boostThreadLocksTest *pBoostThreadLocksTest);
- static int secondFunction(boostThreadLocksTest *pBoostThreadLocksTest,
- boost::upgrade_lock<boost::shared_mutex>& upgr);
- boostThreadLocksTest()
- :myMutex()
- //, myLock(myMutex,boost::defer_lock_t())
- {}
- };
- int boostThreadLocksTest::firstFunction(boostThreadLocksTest *pBoostThreadLocksTest)
- {
- std::cout<<"Entering "<<boost::this_thread::get_id()<<" "<<"firstFunction"<<std::endl;
- boost::upgrade_lock<boost::shared_mutex> myLock(pBoostThreadLocksTest->myMutex);
- pBoostThreadLocksTest->secondFunction(pBoostThreadLocksTest, myLock);
- std::cout<<"Returned From Call "<<boost::this_thread::get_id()<<" "<<"firstFunction"<<std::endl;
- std::cout<<"Returning from "<<boost::this_thread::get_id()<<" "<<"firstFunction"<<std::endl;
- return(0);
- }
- int boostThreadLocksTest::secondFunction(boostThreadLocksTest *, boost::upgrade_lock<boost::shared_mutex>& upgr) {
- std::cout<<"Before Exclusive Locking "<<boost::this_thread::get_id()<<" "<<"secondFunction"<<std::endl;
- boost::upgrade_to_unique_lock<boost::shared_mutex> localUniqueLock(upgr);
- std::cout<<"After Exclusive Locking "<<boost::this_thread::get_id()<<" "<<"secondFunction"<<std::endl;
- return(0);
- }
- int main() {
- boostThreadLocksTest myObject;
- boost::thread_group myThreadGroup;
- myThreadGroup.create_thread(boost::bind(boostThreadLocksTest::firstFunction,&myObject));
- myThreadGroup.create_thread(boost::bind(boostThreadLocksTest::firstFunction,&myObject));
- myThreadGroup.create_thread(boost::bind(boostThreadLocksTest::firstFunction,&myObject));
- myThreadGroup.join_all();
- return 0;
- }
|