static_mutex_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 207 行

CPP
207
字号
/* * * Copyright (c) 2004 * John Maddock * * Use, modification and distribution are subject to 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) * */  /*  *   LOCATION:    see http://www.boost.org for most recent version.  *   FILE         static_mutex_test.cpp  *   VERSION      see <boost/version.hpp>  *   DESCRIPTION: test program for boost::static_mutex.  */#include <iostream>#include <boost/regex/pending/static_mutex.hpp>#include <boost/thread/thread.hpp>#include <boost/timer.hpp>//// we cannot use the regular Boost.Test in here: it is not thread safe// and calls to BOOST_TEST will eventually crash on some compilers // (Borland certainly) due to race conditions inside the Boost.Test lib.//#define BOOST_TEST(pred) if(!(pred)) failed_test(__FILE__, __LINE__, BOOST_STRINGIZE(pred));int total_failures = 0;void failed_test(const char* file, int line, const char* pred){   static boost::static_mutex mut = BOOST_STATIC_MUTEX_INIT ;   boost::static_mutex::scoped_lock guard(mut);   ++total_failures;   std::cout << "Failed test in \"" << file << "\" at line " << line << ": " << pred << std::endl;}void print_cycles(int c){   static boost::static_mutex mut = BOOST_STATIC_MUTEX_INIT ;   boost::static_mutex::scoped_lock guard(mut);   std::cout << "Thread exited after " << c << " cycles." << std::endl;}bool sufficient_time(){   // return true if enough time has passed since the tests began:   static boost::static_mutex mut = BOOST_STATIC_MUTEX_INIT ;   boost::static_mutex::scoped_lock guard(mut);   static boost::timer t;   // is 10 seconds enough?   return t.elapsed() >= 10.0;}// define three trivial test proceedures:bool t1(){   static boost::static_mutex mut = BOOST_STATIC_MUTEX_INIT ;   static int has_lock = 0;   static int data = 10000;   boost::static_mutex::scoped_lock guard(mut);   BOOST_TEST(++has_lock == 1);   BOOST_TEST(guard.locked());   BOOST_TEST(guard);   bool result = (--data > 0) ? true : false;   BOOST_TEST(--has_lock == 0);   return result;}bool t2(){   static boost::static_mutex mut = BOOST_STATIC_MUTEX_INIT ;   static int has_lock = 0;   static int data = 10000;   boost::static_mutex::scoped_lock guard(mut, false);   BOOST_TEST(0 == guard.locked());   BOOST_TEST(!guard);   guard.lock();   BOOST_TEST(++has_lock == 1);   BOOST_TEST(guard.locked());   BOOST_TEST(guard);   bool result = (--data > 0) ? true : false;   BOOST_TEST(--has_lock == 0);   guard.unlock();   BOOST_TEST(0 == guard.locked());   BOOST_TEST(!guard);   return result;}bool t3(){   static boost::static_mutex mut = BOOST_STATIC_MUTEX_INIT ;   static int has_lock = 0;   static int data = 10000;   boost::static_mutex::scoped_lock guard(mut);   BOOST_TEST(++has_lock == 1);   BOOST_TEST(guard.locked());   BOOST_TEST(guard);   bool result = (--data > 0) ? true : false;   BOOST_TEST(--has_lock == 0);   return result;}// define their thread procs:void thread1_proc(){   int cycles = 0;   while(!sufficient_time())   {      t1();      t2();      ++cycles;   }   print_cycles(cycles);}void thread2_proc(){   int cycles = 0;   while(!sufficient_time())   {      t2();      t3();      ++cycles;   }   print_cycles(cycles);}void thread3_proc(){   int cycles = 0;   while(!sufficient_time())   {      t1();      t3();      ++cycles;   }   print_cycles(cycles);}// make sure that at least one of our test proceedures // is called during program startup:struct startup1{   startup1()   {      t1();   }   ~startup1()   {      t1();   }};startup1 up1;int main(){   BOOST_TEST(0 != &up1);      std::list<boost::shared_ptr<boost::thread> > threads;   for(int i = 0; i < 2; ++i)   {      try{         threads.push_back(boost::shared_ptr<boost::thread>(new boost::thread(&thread1_proc)));      }      catch(const std::exception& e)      {         std::cerr << "<note>Thread creation failed with message: " << e.what() << "</note>" << std::endl;      }   }   for(int i = 0; i < 2; ++i)   {      try{         threads.push_back(boost::shared_ptr<boost::thread>(new boost::thread(&thread2_proc)));      }      catch(const std::exception& e)      {         std::cerr << "<note>Thread creation failed with message: " << e.what() << "</note>" << std::endl;      }   }   for(int i = 0; i < 2; ++i)   {      try{         threads.push_back(boost::shared_ptr<boost::thread>(new boost::thread(&thread3_proc)));      }      catch(const std::exception& e)      {         std::cerr << "<note>Thread creation failed with message: " << e.what() << "</note>" << std::endl;      }   }   std::list<boost::shared_ptr<boost::thread> >::const_iterator a(threads.begin()), b(threads.end());   while(a != b)   {      (*a)->join();      ++a;   }   return total_failures;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?