test_thread_launching.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // Copyright (C) 2007-8 Anthony Williams
  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 3
  6. #define BOOST_TEST_MODULE Boost.Threads: thread launching test suite
  7. #include <boost/thread/thread_only.hpp>
  8. #include <boost/test/unit_test.hpp>
  9. #include <boost/ref.hpp>
  10. #include <boost/utility.hpp>
  11. #include <string>
  12. #include <vector>
  13. bool normal_function_called=false;
  14. void normal_function()
  15. {
  16. normal_function_called=true;
  17. }
  18. BOOST_AUTO_TEST_CASE(test_thread_function_no_arguments)
  19. {
  20. boost::thread function(&normal_function);
  21. function.join();
  22. BOOST_CHECK(normal_function_called);
  23. }
  24. int nfoa_res=0;
  25. void normal_function_one_arg(int i)
  26. {
  27. nfoa_res=i;
  28. }
  29. BOOST_AUTO_TEST_CASE(test_thread_function_one_argument)
  30. {
  31. boost::thread function(&normal_function_one_arg,42);
  32. function.join();
  33. BOOST_CHECK_EQUAL(42,nfoa_res);
  34. }
  35. struct callable_no_args
  36. {
  37. static bool called;
  38. void operator()() const
  39. {
  40. called=true;
  41. }
  42. };
  43. bool callable_no_args::called=false;
  44. BOOST_AUTO_TEST_CASE(test_thread_callable_object_no_arguments)
  45. {
  46. callable_no_args func;
  47. boost::thread callable(func);
  48. callable.join();
  49. BOOST_CHECK(callable_no_args::called);
  50. }
  51. struct callable_noncopyable_no_args:
  52. boost::noncopyable
  53. {
  54. callable_noncopyable_no_args() : boost::noncopyable() {}
  55. static bool called;
  56. void operator()() const
  57. {
  58. called=true;
  59. }
  60. };
  61. bool callable_noncopyable_no_args::called=false;
  62. BOOST_AUTO_TEST_CASE(test_thread_callable_object_ref_no_arguments)
  63. {
  64. callable_noncopyable_no_args func;
  65. boost::thread callable(boost::ref(func));
  66. callable.join();
  67. BOOST_CHECK(callable_noncopyable_no_args::called);
  68. }
  69. struct callable_one_arg
  70. {
  71. static bool called;
  72. static int called_arg;
  73. void operator()(int arg) const
  74. {
  75. called=true;
  76. called_arg=arg;
  77. }
  78. };
  79. bool callable_one_arg::called=false;
  80. int callable_one_arg::called_arg=0;
  81. BOOST_AUTO_TEST_CASE(test_thread_callable_object_one_argument)
  82. {
  83. callable_one_arg func;
  84. boost::thread callable(func,42);
  85. callable.join();
  86. BOOST_CHECK(callable_one_arg::called);
  87. BOOST_CHECK_EQUAL(callable_one_arg::called_arg,42);
  88. }
  89. struct callable_multiple_arg
  90. {
  91. static bool called_two;
  92. static int called_two_arg1;
  93. static double called_two_arg2;
  94. static bool called_three;
  95. static std::string called_three_arg1;
  96. static std::vector<int> called_three_arg2;
  97. static int called_three_arg3;
  98. void operator()(int arg1,double arg2) const
  99. {
  100. called_two=true;
  101. called_two_arg1=arg1;
  102. called_two_arg2=arg2;
  103. }
  104. void operator()(std::string const& arg1,std::vector<int> const& arg2,int arg3) const
  105. {
  106. called_three=true;
  107. called_three_arg1=arg1;
  108. called_three_arg2=arg2;
  109. called_three_arg3=arg3;
  110. }
  111. };
  112. bool callable_multiple_arg::called_two=false;
  113. bool callable_multiple_arg::called_three=false;
  114. int callable_multiple_arg::called_two_arg1;
  115. double callable_multiple_arg::called_two_arg2;
  116. std::string callable_multiple_arg::called_three_arg1;
  117. std::vector<int> callable_multiple_arg::called_three_arg2;
  118. int callable_multiple_arg::called_three_arg3;
  119. BOOST_AUTO_TEST_CASE(test_thread_callable_object_multiple_arguments)
  120. {
  121. std::vector<int> x;
  122. for(unsigned i=0;i<7;++i)
  123. {
  124. x.push_back(i*i);
  125. }
  126. callable_multiple_arg func;
  127. // Avoid
  128. // boost/bind/bind.hpp(392) : warning C4244: 'argument' : conversion from 'double' to 'int', possible loss of data
  129. boost::thread callable3(func,"hello",x,1);
  130. callable3.join();
  131. BOOST_CHECK(callable_multiple_arg::called_three);
  132. BOOST_CHECK_EQUAL(callable_multiple_arg::called_three_arg1,"hello");
  133. BOOST_CHECK_EQUAL(callable_multiple_arg::called_three_arg2.size(),x.size());
  134. for(unsigned j=0;j<x.size();++j)
  135. {
  136. BOOST_CHECK_EQUAL(callable_multiple_arg::called_three_arg2.at(j),x[j]);
  137. }
  138. BOOST_CHECK_EQUAL(callable_multiple_arg::called_three_arg3,1);
  139. double const dbl=1.234;
  140. boost::thread callable2(func,19,dbl);
  141. callable2.join();
  142. BOOST_CHECK(callable_multiple_arg::called_two);
  143. BOOST_CHECK_EQUAL(callable_multiple_arg::called_two_arg1,19);
  144. BOOST_CHECK_EQUAL(callable_multiple_arg::called_two_arg2,dbl);
  145. }
  146. struct X
  147. {
  148. bool function_called;
  149. int arg_value;
  150. X():
  151. function_called(false),
  152. arg_value(0)
  153. {}
  154. void f0()
  155. {
  156. function_called=true;
  157. }
  158. void f1(int i)
  159. {
  160. arg_value=i;
  161. }
  162. };
  163. BOOST_AUTO_TEST_CASE(test_thread_member_function_no_arguments)
  164. {
  165. X x;
  166. boost::thread function(&X::f0,&x);
  167. function.join();
  168. BOOST_CHECK(x.function_called);
  169. }
  170. BOOST_AUTO_TEST_CASE(test_thread_member_function_one_argument)
  171. {
  172. X x;
  173. boost::thread function(&X::f1,&x,42);
  174. function.join();
  175. BOOST_CHECK_EQUAL(42,x.arg_value);
  176. }