diff options
Diffstat (limited to 'ACE/examples/APG/ThreadSafety/Mutex.cpp')
-rw-r--r-- | ACE/examples/APG/ThreadSafety/Mutex.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/ACE/examples/APG/ThreadSafety/Mutex.cpp b/ACE/examples/APG/ThreadSafety/Mutex.cpp new file mode 100644 index 00000000000..6f679b7fb0c --- /dev/null +++ b/ACE/examples/APG/ThreadSafety/Mutex.cpp @@ -0,0 +1,74 @@ +// $Id$ + +#include "ace/config-lite.h" +#if defined (ACE_HAS_THREADS) + +#include "ace/Synch.h" +#include "ace/Guard_T.h" + +class LogMessage +{ +public: + enum { CRITICAL, NORMAL}; + + virtual ~LogMessage () + { + } + + virtual int priority (void) + { + return NORMAL; + } +}; + +class CriticalLogMessage : public LogMessage +{ + virtual int priority (void) + { + return LogMessage::CRITICAL; + } +}; + +// Listing 1 code/ch14 +typedef ACE_Thread_Mutex MUTEX; +class Logger +{ +public: + void log (LogMessage *msg) + { + ACE_GUARD (MUTEX, mon, mutex_); + if (msg->priority () == LogMessage::CRITICAL) + logCritical (msg); + } + + void logCritical (LogMessage *) + { + // Acquires the same mutex as log()! + ACE_GUARD(MUTEX, mon, mutex_); + } + +private: + MUTEX mutex_; +}; + +static Logger logger; + +int ACE_TMAIN (int, ACE_TCHAR *[]) +{ + CriticalLogMessage cm; + logger.log(&cm); // Will cause deadlock. + return 0; +} +// Listing 1 + +#else +#include "ace/OS_main.h" +#include "ace/OS_NS_stdio.h" + +int ACE_TMAIN (int, ACE_TCHAR *[]) +{ + ACE_OS::puts (ACE_TEXT ("This example requires threads.")); + return 0; +} + +#endif /* ACE_HAS_THREADS */ |