test_11053.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Copyright (C) 2015 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. #define BOOST_THREAD_VERSION 4
  6. #include <boost/thread.hpp>
  7. #include <boost/thread/tss.hpp>
  8. #include <boost/shared_ptr.hpp>
  9. #include <iostream>
  10. struct A
  11. {
  12. void DoWork()
  13. {
  14. std::cout << "A: doing work\n";
  15. if (!m_ptr.get())
  16. m_ptr.reset(new WorkSpace());
  17. // do not very much
  18. for (size_t i = 0; i < 10; ++i)
  19. m_ptr->a += 10;
  20. }
  21. private:
  22. struct WorkSpace
  23. {
  24. int a;
  25. WorkSpace() : a(0) {}
  26. };
  27. boost::thread_specific_ptr<WorkSpace> m_ptr;
  28. };
  29. struct B
  30. {
  31. void DoWork()
  32. {
  33. std::cout << "B: doing work\n";
  34. if (!m_ptr.get())
  35. m_ptr.reset(new A());
  36. m_ptr->DoWork();
  37. }
  38. private:
  39. boost::thread_specific_ptr<A> m_ptr;
  40. };
  41. struct C
  42. {
  43. void DoWork()
  44. {
  45. std::cout << "C: doing work\n";
  46. if (!m_ptr.get())
  47. m_ptr.reset(new B());
  48. m_ptr->DoWork();
  49. }
  50. private:
  51. boost::thread_specific_ptr<B> m_ptr;
  52. };
  53. int main(int ac, char** av)
  54. {
  55. std::cout << "test starting\n";
  56. boost::shared_ptr<C> p_C(new C);
  57. boost::thread cWorker(&C::DoWork, p_C);
  58. cWorker.join();
  59. std::cout << "test stopping\n";
  60. return 0;
  61. }