12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // Copyright (C) 2011 Vicente J. Botet Escriba
- //
- // 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)
- #define BOOST_THREAD_USES_MOVE
- #include <boost/thread/thread.hpp>
- #include <boost/thread/mutex.hpp>
- #include <boost/thread/csbl/vector.hpp>
- #include <iostream>
- #include <boost/detail/lightweight_test.hpp>
- #include <boost/static_assert.hpp>
- int count = 0;
- boost::mutex mutex;
- namespace
- {
- template <typename TC>
- void join_all(TC & tc)
- {
- for (typename TC::iterator it = tc.begin(); it != tc.end(); ++it)
- {
- it->join();
- }
- }
- template <typename TC>
- void interrupt_all(TC & tc)
- {
- #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
- for (typename TC::iterator it = tc.begin(); it != tc.end(); ++it)
- {
- it->interrupt();
- }
- #endif
- }
- }
- void increment_count()
- {
- boost::unique_lock<boost::mutex> lock(mutex);
- std::cout << "count = " << ++count << std::endl;
- }
- #if defined BOOST_NO_CXX11_RVALUE_REFERENCES && defined BOOST_THREAD_USES_MOVE
- BOOST_STATIC_ASSERT(::boost::is_function<boost::rv<boost::rv<boost::thread> >&>::value==false);
- #endif
- int main()
- {
- typedef boost::csbl::vector<boost::thread> thread_vector;
- {
- thread_vector threads;
- threads.reserve(10);
- for (int i = 0; i < 10; ++i)
- {
- boost::thread th(&increment_count);
- threads.push_back(boost::move(th));
- }
- join_all(threads);
- }
- count = 0;
- {
- thread_vector threads;
- threads.reserve(10);
- for (int i = 0; i < 10; ++i)
- {
- threads.push_back(BOOST_THREAD_MAKE_RV_REF(boost::thread(&increment_count)));
- }
- join_all(threads);
- }
- count = 0;
- {
- thread_vector threads;
- threads.reserve(10);
- for (int i = 0; i < 10; ++i)
- {
- threads.emplace_back(&increment_count);
- }
- join_all(threads);
- }
- count = 0;
- {
- thread_vector threads;
- threads.reserve(10);
- for (int i = 0; i < 10; ++i)
- {
- threads.emplace_back(&increment_count);
- }
- interrupt_all(threads);
- join_all(threads);
- }
- return boost::report_errors();
- }
|