1 // Copyright (C) 2011 Vicente J. Botet Escriba 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_USES_MOVE 7 8 #include <boost/config.hpp> 9 #include <boost/thread/thread.hpp> 10 #include <boost/thread/mutex.hpp> 11 #include <boost/thread/csbl/list.hpp> 12 //#include <boost/interprocess/smart_ptr/shared_ptr.hpp> 13 #include <boost/smart_ptr.hpp> 14 #include <iostream> 15 #include <boost/detail/lightweight_test.hpp> 16 17 18 int count = 0; 19 boost::mutex mutex; 20 21 namespace { 22 23 24 template <typename TC> join_all(TC & tc)25void join_all(TC & tc) 26 { 27 for (typename TC::iterator it = tc.begin(); it != tc.end(); ++it) 28 { 29 (*it)->join(); 30 } 31 } 32 33 increment_count()34void increment_count() 35 { 36 boost::unique_lock<boost::mutex> lock(mutex); 37 std::cout << "count = " << ++count << std::endl; 38 } 39 40 template <class T> 41 struct default_delete 42 { 43 typedef T* pointer; 44 default_delete__anon0e5acf440111::default_delete45 BOOST_CONSTEXPR default_delete() BOOST_NOEXCEPT {} //= default; 46 template <class U> default_delete__anon0e5acf440111::default_delete47 default_delete(const default_delete<U>&) BOOST_NOEXCEPT 48 {} operator ()__anon0e5acf440111::default_delete49 void operator()(T* ptr) const 50 { 51 delete ptr; 52 } 53 }; 54 55 } main()56int main() 57 { 58 { 59 typedef boost::shared_ptr<boost::thread > thread_ptr; 60 //typedef boost::interprocess::shared_ptr<boost::thread, std::allocator<boost::thread>, default_delete<boost::thread> > thread_ptr; 61 typedef boost::csbl::list<thread_ptr > thread_ptr_list; 62 thread_ptr_list threads; 63 for (int i = 0; i < 10; ++i) 64 { 65 //threads.push_back(BOOST_THREAD_MAKE_RV_REF(thread_ptr(new boost::thread(&increment_count)))); 66 threads.push_back(thread_ptr(new boost::thread(&increment_count))); 67 } 68 BOOST_TEST(threads.size()==10); 69 //join_all(threads); 70 for (thread_ptr_list::iterator it = threads.begin(); it != threads.end(); ++it) 71 { 72 (*it)->join(); 73 } 74 } 75 count = 0; 76 { 77 typedef boost::shared_ptr<boost::thread > thread_ptr; 78 //typedef boost::interprocess::shared_ptr<boost::thread, std::allocator<boost::thread>, default_delete<boost::thread> > thread_ptr; 79 typedef boost::csbl::list<thread_ptr > thread_ptr_list; 80 thread_ptr_list threads; 81 for (int i = 0; i < 10; ++i) 82 { 83 //threads.push_back(BOOST_THREAD_MAKE_RV_REF(thread_ptr(new boost::thread(&increment_count)))); 84 threads.push_back(thread_ptr(new boost::thread(&increment_count))); 85 } 86 BOOST_TEST(threads.size()==10); 87 thread_ptr sth(new boost::thread(&increment_count)); 88 threads.push_back(sth); 89 BOOST_TEST(threads.size()==11); 90 threads.remove(sth); 91 BOOST_TEST(threads.size()==10); 92 sth->join(); 93 //join_all(threads); 94 for (thread_ptr_list::iterator it = threads.begin(); it != threads.end(); ++it) 95 { 96 (*it)->join(); 97 } 98 } 99 100 return boost::report_errors(); 101 } 102