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

source code of boost/libs/thread/test/test_11053.cpp