// This test program illustrates how the ACE barrier synchronization // $Id$ // mechanisms work in conjunction with the ACE_Task and the // ACE_Thread_Manager. It is instructive to compare this with the // test_barrier.cpp test to see how they differ. #include "ace/Task.h" #include "ace/Service_Config.h" #if defined (ACE_HAS_THREADS) #include "ace/Task.h" class Barrier_Task : public ACE_Task { public: Barrier_Task (ACE_Thread_Manager *thr_mgr, int n_threads, int n_iterations); virtual int svc (void); // Iterate time printing off a message and "waiting" // for all other threads to complete this iteration. private: ACE_Barrier barrier_; // Reference to the tester barrier. This controls each // iteration of the tester function running in every thread. int n_iterations_; // Number of iterations to run. // = Not needed for this test. virtual int open (void *) { return 0; } virtual int close (u_long) { return 0; } virtual int put (ACE_Message_Block *, ACE_Time_Value *) { return 0; } }; Barrier_Task::Barrier_Task (ACE_Thread_Manager *thr_mgr, int n_threads, int n_iterations) : ACE_Task (thr_mgr), barrier_ (n_threads), n_iterations_ (n_iterations) { // Create worker threads. if (this->activate (THR_NEW_LWP, n_threads) == -1) ACE_ERROR ((LM_ERROR, "%p\n", "activate failed")); } // Iterate time printing off a message and "waiting" // for all other threads to complete this iteration. int Barrier_Task::svc (void) { // Note that the ACE_Task::svc_run() method automatically adds us to // the Thread_Manager when the thread begins. for (int iterations = 1; iterations <= this->n_iterations_; iterations++) { ACE_DEBUG ((LM_DEBUG, "(%t) in iteration %d\n", iterations)); // Block until all other threads have waited, then continue. this->barrier_.wait (); } // Note that the ACE_Task::svc_run() method automatically removes us // from the Thread_Manager when the thread exits. return 0; } // Default number of threads to spawn. static const int DEFAULT_ITERATIONS = 5; int main (int argc, char *argv[]) { int n_threads = argc > 1 ? ACE_OS::atoi (argv[1]) : ACE_DEFAULT_THREADS; int n_iterations = argc > 2 ? ACE_OS::atoi (argv[2]) : DEFAULT_ITERATIONS; Barrier_Task barrier_task (ACE_Service_Config::thr_mgr (), n_threads, n_iterations); // Wait for all the threads to reach their exit point. ACE_Service_Config::thr_mgr ()->wait (); ACE_DEBUG ((LM_DEBUG, "(%t) done\n")); return 0; } #else int main (int, char *[]) { ACE_ERROR ((LM_ERROR, "threads not supported on this platform\n")); return 0; } #endif /* ACE_HAS_THREADS */