test_4882.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright (C) 2010 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 2
  6. //#define BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN
  7. //#define BOOST_THREAD_USES_LOG
  8. #include <boost/thread/thread_only.hpp>
  9. #include <boost/thread/shared_mutex.hpp>
  10. #include <boost/detail/no_exceptions_support.hpp>
  11. //#include <boost/thread/detail/log.hpp>
  12. boost::shared_mutex mutex;
  13. void thread()
  14. {
  15. //BOOST_THREAD_LOG << "<thrd" << BOOST_THREAD_END_LOG;
  16. BOOST_TRY
  17. {
  18. for (int i =0; i<10; ++i)
  19. {
  20. #ifndef BOOST_THREAD_USES_CHRONO
  21. boost::system_time timeout = boost::get_system_time() + boost::posix_time::milliseconds(50);
  22. if (mutex.timed_lock(timeout))
  23. {
  24. //BOOST_THREAD_LOG << "<thrd" << " i="<<i << BOOST_THREAD_END_LOG;
  25. boost::this_thread::sleep(boost::posix_time::milliseconds(10));
  26. mutex.unlock();
  27. //BOOST_THREAD_LOG << "<thrd" << " i="<<i << BOOST_THREAD_END_LOG;
  28. }
  29. #else
  30. boost::chrono::system_clock::time_point timeout = boost::chrono::system_clock::now() + boost::chrono::milliseconds(50);
  31. //BOOST_THREAD_LOG << "<thrd" << " i="<<i << BOOST_THREAD_END_LOG;
  32. if (mutex.try_lock_until(timeout))
  33. {
  34. //BOOST_THREAD_LOG << "<thrd" << " i="<<i << BOOST_THREAD_END_LOG;
  35. boost::this_thread::sleep_for(boost::chrono::milliseconds(10));
  36. mutex.unlock();
  37. //BOOST_THREAD_LOG << "<thrd" << " i="<<i << BOOST_THREAD_END_LOG;
  38. }
  39. #endif
  40. }
  41. }
  42. BOOST_CATCH (boost::lock_error& )
  43. {
  44. //BOOST_THREAD_LOG << "lock_error exception thrd>" << BOOST_THREAD_END_LOG;
  45. }
  46. BOOST_CATCH (...)
  47. {
  48. //BOOST_THREAD_LOG << "exception thrd>" << BOOST_THREAD_END_LOG;
  49. }
  50. BOOST_CATCH_END
  51. //BOOST_THREAD_LOG << "thrd>" << BOOST_THREAD_END_LOG;
  52. }
  53. int main()
  54. {
  55. //BOOST_THREAD_LOG << "<main" << BOOST_THREAD_END_LOG;
  56. const int nrThreads = 20;
  57. boost::thread* threads[nrThreads];
  58. for (int i = 0; i < nrThreads; ++i)
  59. threads[i] = new boost::thread(&thread);
  60. for (int i = 0; i < nrThreads; ++i)
  61. {
  62. threads[i]->join();
  63. //BOOST_THREAD_LOG << "main" << BOOST_THREAD_END_LOG;
  64. delete threads[i];
  65. //BOOST_THREAD_LOG << "main" << BOOST_THREAD_END_LOG;
  66. }
  67. //BOOST_THREAD_LOG << "main>" << BOOST_THREAD_END_LOG;
  68. return 0;
  69. }