test_4648.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // Copyright (C) 2010 Vicente Botet
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #include <iostream>
  6. #include <boost/thread.hpp>
  7. #include <boost/current_function.hpp>
  8. class boostThreadLocksTest
  9. {
  10. public:
  11. boost::shared_mutex myMutex;
  12. //boost::upgrade_lock<boost::shared_mutex> myLock;
  13. static int firstFunction(boostThreadLocksTest *pBoostThreadLocksTest);
  14. static int secondFunction(boostThreadLocksTest *pBoostThreadLocksTest,
  15. boost::upgrade_lock<boost::shared_mutex>& upgr);
  16. boostThreadLocksTest()
  17. :myMutex()
  18. //, myLock(myMutex,boost::defer_lock_t())
  19. {}
  20. };
  21. int boostThreadLocksTest::firstFunction(boostThreadLocksTest *pBoostThreadLocksTest)
  22. {
  23. std::cout<<"Entering "<<boost::this_thread::get_id()<<" "<<"firstFunction"<<std::endl;
  24. boost::upgrade_lock<boost::shared_mutex> myLock(pBoostThreadLocksTest->myMutex);
  25. pBoostThreadLocksTest->secondFunction(pBoostThreadLocksTest, myLock);
  26. std::cout<<"Returned From Call "<<boost::this_thread::get_id()<<" "<<"firstFunction"<<std::endl;
  27. std::cout<<"Returning from "<<boost::this_thread::get_id()<<" "<<"firstFunction"<<std::endl;
  28. return(0);
  29. }
  30. int boostThreadLocksTest::secondFunction(boostThreadLocksTest *, boost::upgrade_lock<boost::shared_mutex>& upgr) {
  31. std::cout<<"Before Exclusive Locking "<<boost::this_thread::get_id()<<" "<<"secondFunction"<<std::endl;
  32. boost::upgrade_to_unique_lock<boost::shared_mutex> localUniqueLock(upgr);
  33. std::cout<<"After Exclusive Locking "<<boost::this_thread::get_id()<<" "<<"secondFunction"<<std::endl;
  34. return(0);
  35. }
  36. int main() {
  37. boostThreadLocksTest myObject;
  38. boost::thread_group myThreadGroup;
  39. myThreadGroup.create_thread(boost::bind(boostThreadLocksTest::firstFunction,&myObject));
  40. myThreadGroup.create_thread(boost::bind(boostThreadLocksTest::firstFunction,&myObject));
  41. myThreadGroup.create_thread(boost::bind(boostThreadLocksTest::firstFunction,&myObject));
  42. myThreadGroup.join_all();
  43. return 0;
  44. }