diff options
Diffstat (limited to 'examples/Threads/test_auto_event.cpp')
-rw-r--r-- | examples/Threads/test_auto_event.cpp | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/examples/Threads/test_auto_event.cpp b/examples/Threads/test_auto_event.cpp new file mode 100644 index 00000000000..24de2e9d230 --- /dev/null +++ b/examples/Threads/test_auto_event.cpp @@ -0,0 +1,106 @@ +// This test shows the use of an ACE_Auto_Event as a signaling +// @(#)test_auto_event.cpp 1.1 10/18/96 + +// mechanism. Two threads are created (one a reader, the other a +// writer). The reader waits till the writer has completed +// calculations. Upon waking up the reader prints the data calculated +// by the writer. The writer thread calculates the value and signals +// the reader when the calculation completes. + +#include "ace/Service_Config.h" +#include "ace/Synch.h" +#include "ace/Singleton.h" +#include "ace/Thread_Manager.h" + +// Shared event between reader and writer. The ACE_Thread_Mutex is +// necessary to make sure that only one ACE_Auto_Event is created. +// The default constructor for ACE_Auto_Event sets it initially into +// the non-signaled state. + +typedef ACE_Singleton <ACE_Auto_Event, ACE_Thread_Mutex> EVENT; + +// work time for writer +static int work_time; + +// Reader thread. +static void * +reader (void *arg) +{ + // Shared data via a reference. + int& data = *(int *) arg; + + ACE_Thread_Control tc (ACE_Service_Config::thr_mgr ()); + + // Wait for writer to complete. + + ACE_DEBUG ((LM_DEBUG, "(%t) reader: waiting...... \n")); + + if (EVENT::instance ()->wait () == -1) + { + ACE_ERROR ((LM_ERROR, "thread wait failed")); + ACE_OS::exit (0); + } + + // Read shared data. + ACE_DEBUG ((LM_DEBUG, "(%t) reader: value of data is: %d \n", data)); + + return 0; +} + +// Writer thread. +static void * +writer (void *arg) +{ + int result; + + int& data = *(int *) arg; + + ACE_Thread_Control tc (ACE_Service_Config::thr_mgr ()); + + // Calculate (work). + ACE_DEBUG ((LM_DEBUG, "(%t) writer: working for %d secs\n", work_time)); + ACE_OS::sleep (work_time); + + // Write shared data. + data = 42; + + // Wake up reader. + ACE_DEBUG ((LM_DEBUG, "(%t) writer: calculation complete, waking reader\n")); + + if (EVENT::instance ()->signal () == -1) + { + ACE_ERROR ((LM_ERROR, "thread wait failed")); + ACE_OS::exit (0); + } + + return 0; +} + +int +main (int argc, char **argv) +{ + // Shared data: set by writer, read by reader. + int data; + + // Work time for writer. + work_time = argc == 2 ? atoi (argv[1]) : 5; + + // threads manager + ACE_Thread_Manager& tm = *ACE_Service_Config::thr_mgr (); + + // Create reader thread. + if (tm.spawn (reader, (void *) &data) == -1) + ACE_ERROR_RETURN ((LM_ERROR, "thread create for reader failed"), -1); + + // Create writer thread. + if (tm.spawn (writer, (void *) &data) == -1) + ACE_ERROR_RETURN ((LM_ERROR, "thread create for writer failed"), -1); + + // Wait for both. + if (tm.wait () == -1) + ACE_ERROR_RETURN ((LM_ERROR, "thread wait failed"), -1); + else + ACE_DEBUG ((LM_ERROR, "graceful exit\n")); + + return 0; +} |