multithreading.cpp

来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 265 行

CPP
265
字号
// $Id: Multithreading.cpp 78962 2007-07-20 03:27:14Z sowayaa $//// ============================================================================//// = LIBRARY//    examples//// = FILENAME//    Multithreading.cpp//// = DESCRIPTION////    This application tests multiple threads simultaneously calling//    Reactor::handle_events(). It also shows how different threads//    can update the state of Reactor by registering and removing//    Event_Handlers.////    Note that this test will only work with WFMO_Reactor//// = AUTHOR//    Irfan Pyarali//// ============================================================================#include "ace/OS_main.h"#if defined (ACE_WIN32)#include "ace/Task.h"#include "ace/Reactor.h"#include "ace/WFMO_Reactor.h"#include "ace/Get_Opt.h"#include "ace/OS_NS_time.h"ACE_RCSID(WFMO_Reactor, Multithreading, "$Id: Multithreading.cpp 78962 2007-07-20 03:27:14Z sowayaa $")static int concurrent_threads = 1;static int number_of_handles = static_cast<int> (ACE_Reactor::instance ()->size ());static int number_of_handles_to_signal = 1;static int interval = 2;static int iterations = 10;// Explain usage and exit.static voidprint_usage_and_die (void){  ACE_DEBUG ((LM_DEBUG,              "usage: \n\t"              "[-t (# of threads - default 1)] \n\t"              "[-h (# of handlers) - default 62] \n\t"              "[-i (# time interval between signals) - default 2] \n\t"              "[-s (# of handles to signal) - default 1] \n\t"              "[-e (# of iterations) - default 10] \n\t"));  ACE_OS::exit (1);}// Parse the command-line arguments and set options.static voidparse_args (int argc, ACE_TCHAR **argv){  ACE_Get_Opt get_opt (argc, argv, ACE_TEXT("t:h:s:i:e:"));  int c;  while ((c = get_opt ()) != -1)    switch (c)      {      case 't':        concurrent_threads = ACE_OS::atoi (get_opt.opt_arg ());        break;      case 'e':        iterations = ACE_OS::atoi (get_opt.opt_arg ());        break;      case 'h':        number_of_handles = ACE_OS::atoi (get_opt.opt_arg ());        break;      case 'i':        interval = ACE_OS::atoi (get_opt.opt_arg ());        break;      case 's':        number_of_handles_to_signal = ACE_OS::atoi (get_opt.opt_arg ());        break;      default:        print_usage_and_die ();        break;      }}class Task_Handler : public ACE_Task<ACE_NULL_SYNCH>{public:  Task_Handler (size_t number_of_handles,                size_t concurrent_threads);  // Constructor.  ~Task_Handler (void);  // Destructor.  virtual int handle_close (ACE_HANDLE handle,                            ACE_Reactor_Mask close_mask);  // Called when object is removed from the ACE_Reactor  int handle_signal (int signum, siginfo_t * = 0, ucontext_t * = 0);  // Handle events being signaled by the main thread.  virtual int handle_timeout (const ACE_Time_Value &tv,                              const void *arg = 0);  // Called when timer expires.  int svc (void);  // Task event loop.  //FUZZ: disable check_for_lack_ACE_OS  int signal (size_t index);  // Signal an event.  //FUZZ: enable check_for_lack_ACE_OSprivate:  ACE_Auto_Event *events_;};// All threads do reactor->handle_events ()intTask_Handler::svc (void){  // Try to become the owner  ACE_Reactor::instance ()->owner (ACE_Thread::self ());  // Run the event loop.  return ACE_Reactor::run_event_loop ();}Task_Handler::Task_Handler (size_t number_of_handles,                            size_t concurrent_threads){  ACE_NEW (this->events_, ACE_Auto_Event [number_of_handles]);  for (size_t i = 0; i < number_of_handles; ++i)    if (ACE_Reactor::instance ()->register_handler (this,                                                    this->events_[i].handle ()) == -1)      ACE_ERROR ((LM_ERROR,                  "%p\t cannot register handle %d with Reactor\n",                  "Task_Handler::Task_Handler",                  i));  // Make us an active object.  if (this->activate (THR_NEW_LWP,                      static_cast<int> (concurrent_threads)) == -1)    ACE_ERROR ((LM_ERROR, "%p\t cannot activate task\n",                "activate"));}Task_Handler::~Task_Handler (void){  this->reactor (0);  delete [] this->events_;}intTask_Handler::handle_signal (int, siginfo_t *siginfo, ucontext_t *){  // When signaled, print message, remove self, and add self  // This will force Reactor to update its internal handle tables  ACE_DEBUG ((LM_DEBUG,              "(%t) calls handle_signal for handle %d\n",              siginfo->si_handle_));  if (ACE_Reactor::instance ()->remove_handler (siginfo->si_handle_,                                                ACE_Event_Handler::DONT_CALL) == -1)    return -1;  // ACE_ERROR_RETURN ((LM_ERROR,  //                   "(%t) %p\tTask cannot be unregistered from Reactor: handle value = %d\n",  //                   "Task_Handler::handle_signal",  //                   siginfo->si_handle_), -1);  if (ACE_Reactor::instance ()->register_handler (this,                                                  siginfo->si_handle_) == -1)    return -1;  // ACE_ERROR_RETURN ((LM_ERROR,  //                   "(%t) %p\tTask cannot be registered with Reactor: handle value = %d\n",  //                   "Task_Handler::handle_signal",  //                   siginfo->si_handle_), -1);  return 0;}intTask_Handler::handle_close (ACE_HANDLE handle,                            ACE_Reactor_Mask){  ACE_DEBUG ((LM_DEBUG, "(%t) handle_close() called: handle value = %d\n",              handle));  return 0;}intTask_Handler::handle_timeout (const ACE_Time_Value &,                              const void *arg){  ACE_DEBUG ((LM_DEBUG, "(%t) handle_timeout() called: iteration value = %d\n",              size_t (arg)));  return 0;}intTask_Handler::signal (size_t index){  return this->events_[index].signal ();}intACE_TMAIN (int argc, ACE_TCHAR **argv){  parse_args (argc, argv);  Task_Handler task (number_of_handles,                     concurrent_threads);  ACE_OS::srand ((u_int) ACE_OS::time (0L));  for (int i = 1; i <= iterations; i++)    {      // Sleep for a while      ACE_OS::sleep (interval);      // Randomly generate events      ACE_DEBUG ((LM_DEBUG, "********************************************************\n"));      ACE_DEBUG ((LM_DEBUG, "(%t -- main thread) signaling %d events : iteration = %d\n",                  number_of_handles_to_signal,                  i));      ACE_DEBUG ((LM_DEBUG, "********************************************************\n"));      // Setup a timer for the task      if (ACE_Reactor::instance ()->schedule_timer (&task,                                                    (void *)((size_t)i),                                                    ACE_Time_Value::zero) == -1)        ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "schedule_timer"), -1);      for (int i = 0; i < number_of_handles_to_signal; i++)        // Randomly select a handle to signal.        task.signal (ACE_OS::rand() % number_of_handles);    }  // Sleep for a while  ACE_OS::sleep (interval);  // End the Reactor event loop  ACE_Reactor::end_event_loop ();  // Wait for all threads to exit  ACE_Thread_Manager::instance ()->wait ();  // Close the Reactor singleton before exiting this function.  // If we wait for the Object Manager to do this, it will be too  // late since Task_Handler instance would have disappeared.  ACE_Reactor::close_singleton ();  return 0;}#else /* !ACE_WIN32 */intACE_TMAIN (int, ACE_TCHAR **){  return 0;}#endif /* ACE_WIN32 */

⌨️ 快捷键说明

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