semaphore_test_template.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 321 行

HPP
321
字号
////////////////////////////////////////////////////////////////////////////////// (C) Copyright Ion Gaztanaga 2004-2007. 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)//// See http://www.boost.org/libs/interprocess for documentation.////////////////////////////////////////////////////////////////////////////////#ifndef BOOST_INTERPROCESS_TEST_SEMAPHORE_TEST_TEMPLATE_HEADER#define BOOST_INTERPROCESS_TEST_SEMAPHORE_TEST_TEMPLATE_HEADER#include <boost/interprocess/detail/config_begin.hpp>#include <boost/interprocess/exceptions.hpp>#include "boost_interprocess_check.hpp"#include "util.hpp"#include <boost/thread/thread.hpp>#include <boost/thread/xtime.hpp>#include <iostream>namespace boost { namespace interprocess { namespace test {template <typename P>struct test_wait{   void operator()()   {/*      mutex_type interprocess_mutex;      boost::interprocess::interprocess_condition interprocess_condition;      // Test the lock's constructors.      {         wait_type lock(interprocess_mutex, boost::interprocess::defer_lock);         BOOST_INTERPROCES_CHECK(!lock);      }      wait_type lock(interprocess_mutex);      BOOST_INTERPROCES_CHECK(lock ? true : false);      // Test the lock and unlock methods.      lock.unlock();      BOOST_INTERPROCES_CHECK(!lock);      lock.lock();      BOOST_INTERPROCES_CHECK(lock ? true : false);*/   }};template <typename P>struct test_try_wait{   void operator()()   {/*      mutex_type interprocess_mutex;      boost::interprocess::interprocess_condition interprocess_condition;      // Test the lock's constructors.      {         try_to_wait_type lock(interprocess_mutex, boost::interprocess::try_to_lock);         BOOST_INTERPROCES_CHECK(lock ? true : false);      }      {         try_to_wait_type lock(interprocess_mutex, boost::interprocess::defer_lock);         BOOST_INTERPROCES_CHECK(!lock);      }      try_to_wait_type lock(interprocess_mutex);      BOOST_INTERPROCES_CHECK(lock ? true : false);      // Test the lock, unlock and trylock methods.      lock.unlock();      BOOST_INTERPROCES_CHECK(!lock);      lock.lock();      BOOST_INTERPROCES_CHECK(lock ? true : false);      lock.unlock();      BOOST_INTERPROCES_CHECK(!lock);      BOOST_INTERPROCES_CHECK(lock.try_lock());      BOOST_INTERPROCES_CHECK(lock ? true : false);*/   }};template <typename P>struct test_timed_wait{   void operator()()   {/*      mutex_type interprocess_mutex;      boost::interprocess::interprocess_condition interprocess_condition;      // Test the lock's constructors.      {         // Construct and initialize an xtime for a fast time out.         boost::posix_time::ptime pt = delay(100, 0);         timed_wait_type lock(interprocess_mutex, pt);         BOOST_INTERPROCES_CHECK(lock ? true : false);      }      {         timed_wait_type lock(interprocess_mutex, boost::interprocess::defer_lock);         BOOST_INTERPROCES_CHECK(!lock);      }      timed_wait_type lock(interprocess_mutex);      BOOST_INTERPROCES_CHECK(lock ? true : false);      // Test the lock, unlock and timedlock methods.      lock.unlock();      BOOST_INTERPROCES_CHECK(!lock);      lock.lock();      BOOST_INTERPROCES_CHECK(lock ? true : false);      lock.unlock();      BOOST_INTERPROCES_CHECK(!lock);      boost::posix_time::ptime pt = delay(10, 0);      BOOST_INTERPROCES_CHECK(lock.timed_lock(pt));      BOOST_INTERPROCES_CHECK(lock ? true : false);*/   }};template <typename P>struct test_recursive_lock{   void operator()()   {/*      mutex_type mx;      {         wait_type lock1(mx);         wait_type lock2(mx);      }      {         wait_type lock1(mx, defer_lock);         wait_type lock2(mx, defer_lock);      }      {         wait_type lock1(mx, try_to_lock);         wait_type lock2(mx, try_to_lock);      }      {         //This should always lock         boost::posix_time::ptime pt = delay(3);         wait_type lock1(mx, pt);         wait_type lock2(mx, pt);      }*/   }};// plain_exclusive exercises the "infinite" lock for each//   read_write_mutex type.template<typename P>void wait_and_sleep(void *arg, P &sm){   data<P> *pdata = static_cast<data<P>*>(arg);   boost::interprocess::scoped_lock<P> l(sm);   boost::thread::sleep(xsecs(3*BaseSeconds));   ++shared_val;   pdata->m_value = shared_val;}template<typename P>void try_wait_and_sleep(void *arg, P &sm){   data<P> *pdata = static_cast<data<P>*>(arg);   boost::interprocess::scoped_lock<P> l(sm, boost::interprocess::defer_lock);   if (l.try_lock()){      boost::thread::sleep(xsecs(3*BaseSeconds));      ++shared_val;      pdata->m_value = shared_val;   }}template<typename P>void timed_wait_and_sleep(void *arg, P &sm){   data<P> *pdata = static_cast<data<P>*>(arg);   boost::posix_time::ptime pt(delay(pdata->m_secs));   boost::interprocess::scoped_lock<P>       l (sm, boost::interprocess::defer_lock);   if (l.timed_lock(pt)){      boost::thread::sleep(xsecs(3*BaseSeconds));      ++shared_val;      pdata->m_value = shared_val;   }}template<typename P>void test_mutex_lock(P &sm){   shared_val = 0;   data<P> m1(1,sm);   data<P> m2(2,sm);   // Locker one launches, holds the lock for 3*BaseSeconds seconds.   boost::thread tm1(thread_adapter<P>(&wait_and_sleep, &m1, sm));   //Wait 1*BaseSeconds   boost::thread::sleep(xsecs(1*BaseSeconds));   // Locker two launches, holds the lock for 3*BaseSeconds seconds.   boost::thread tm2(thread_adapter<P>(&wait_and_sleep, &m2, sm));   //Wait completion   tm1.join();   tm2.join();   assert(m1.m_value == 1);   assert(m2.m_value == 2);}template<typename P>void test_mutex_try_lock(P &sm){   shared_val = 0;   data<P> m1(1,sm);   data<P> m2(2,sm);   // Locker one launches, holds the lock for 3*BaseSeconds seconds.   boost::thread tm1(thread_adapter<P>(&try_wait_and_sleep, &m1, sm));   //Wait 1*BaseSeconds   boost::thread::sleep(xsecs(1*BaseSeconds));   // Locker two launches, holds the lock for 3*BaseSeconds seconds.   boost::thread tm2(thread_adapter<P>(&try_wait_and_sleep, &m2, sm));   //Wait completion   tm1.join();   tm2.join();   //Only the first should succeed locking   assert(m1.m_value == 1);   assert(m2.m_value == -1);}template<typename P>void test_mutex_timed_lock(P &sm){   {      shared_val = 0;      data<P> m1(1, sm, 3);      data<P> m2(2, sm, 3);      // Locker one launches, holds the lock for 3*BaseSeconds seconds.      boost::thread tm1(thread_adapter<P>(&timed_wait_and_sleep, &m1, sm));      //Wait 1*BaseSeconds      boost::thread::sleep(xsecs(1*BaseSeconds));      // Locker two launches, holds the lock for 3*BaseSeconds seconds.      boost::thread tm2(thread_adapter<P>(&timed_wait_and_sleep, &m2, sm));      //Wait completion      tm1.join();      tm2.join();      //Both should succeed locking      assert(m1.m_value == 1);      assert(m2.m_value == 2);   }   {      shared_val = 0;      data<P> m1(1, sm, 3);      data<P> m2(2, sm, 3);      // Locker one launches, holds the lock for 3*BaseSeconds seconds.      boost::thread tm1(thread_adapter<P>(&timed_wait_and_sleep, &m1, sm));      //Wait 1*BaseSeconds      boost::thread::sleep(xsecs(1*BaseSeconds));      // Locker two launches, holds the lock for 3*BaseSeconds seconds.      boost::thread tm2(thread_adapter<P>(&timed_wait_and_sleep, &m2, sm));      //Wait completion      tm1.join();      tm2.join();      //Both should succeed locking      assert(m1.m_value == 1);      assert(m2.m_value == 2);   }}template <typename P>inline void test_all_lock(){   //Now generic interprocess_mutex tests   std::cout << "test_wait<" << typeid(P).name() << ">" << std::endl;   test_wait<P>()();   std::cout << "test_try_wait<" << typeid(P).name() << ">" << std::endl;   test_try_wait<P>()();   std::cout << "test_timed_wait<" << typeid(P).name() << ">" << std::endl;   test_timed_wait<P>()();} template <typename P>inline void test_all_recursive_lock(){   //Now generic interprocess_mutex tests   std::cout << "test_recursive_lock<" << typeid(P).name() << ">" << std::endl;   test_recursive_lock<P>()();}template<typename P>void test_all_mutex(){   P mut;   std::cout << "test_mutex_lock<" << typeid(P).name() << ">" << std::endl;   test_mutex_lock(mut);   std::cout << "test_mutex_try_lock<" << typeid(P).name() << ">" << std::endl;   test_mutex_try_lock(mut);   std::cout << "test_mutex_timed_lock<" << typeid(P).name() << ">" << std::endl;   test_mutex_timed_lock(mut);}}}}   //namespace boost { namespace interprocess { namespace test {#include <boost/interprocess/detail/config_end.hpp>#endif   //BOOST_INTERPROCESS_TEST_SEMAPHORE_TEST_TEMPLATE_HEADER

⌨️ 快捷键说明

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