invariant.cpp

来自「ACE自适配通信环境(ADAPTIVE Communication Enviro」· C++ 代码 · 共 197 行

CPP
197
字号
// invariant.cpp,v 4.10 2003/11/01 11:15:24 dhinton Exp// ============================================================================//// = LIBRARY//    examples// // = FILENAME//    invariant.cpp//// = DESCRIPTION//// = AUTHOR//    Tim Harrison// // ============================================================================#include "ace/Get_Opt.h"#include "ace/Singleton.h"#include "ace/Thread_Manager.h"#include "ace/Token_Invariants.h"#if defined (ACE_HAS_THREADS) && defined (ACE_HAS_THREADS_LIBRARY)ACE_RCSID(invariant, invariant, "invariant.cpp,v 4.10 2003/11/01 11:15:24 dhinton Exp")typedef ACE_Token_Invariant_Manager ACE_TOKEN_INVARIANTS;static const char *rwname = "reader/writer";static const char *mutexname = "mutex";static void *run_reader_writer (void *){  for (int x = 0; x < 50; x++)    {      int y = 0;      for (; y < 5; y++)	{	  if (ACE_TOKEN_INVARIANTS::instance ()->reader_acquired (rwname) == 0)	    ACE_ERROR_RETURN ((LM_ERROR, "reader acquire violated invariant.\n"), 0);	  ACE_DEBUG ((LM_DEBUG, "(%t) rlock acquired.\n"));	}      ACE_TOKEN_INVARIANTS::instance ()->rwlock_releasing (rwname);      if (ACE_TOKEN_INVARIANTS::instance ()->reader_acquired (rwname) == 0)	ACE_ERROR_RETURN ((LM_ERROR, "reader renew violated invariant.\n"), 0);      ACE_DEBUG ((LM_DEBUG, "(%t) rlock renewed.\n"));            for (; y > 0; y--)	{	  ACE_TOKEN_INVARIANTS::instance ()->rwlock_releasing (rwname);	  ACE_DEBUG ((LM_DEBUG, "(%t) r-released.\n"));	}      if (ACE_TOKEN_INVARIANTS::instance ()->writer_acquired (rwname) == 0)	ACE_ERROR_RETURN ((LM_ERROR, "writer acquire violated invariant.\n"), 0);      ACE_DEBUG ((LM_DEBUG, "\t\t(%t) wlock acquired.\n"));      ACE_TOKEN_INVARIANTS::instance ()->rwlock_releasing (rwname);      if (ACE_TOKEN_INVARIANTS::instance ()->writer_acquired (rwname) == 0)	ACE_ERROR_RETURN ((LM_ERROR, "writer renew violated invariant.\n"), 0);      ACE_DEBUG ((LM_DEBUG, "(%t) rlock renewed.\n"));      ACE_TOKEN_INVARIANTS::instance ()->rwlock_releasing (rwname);    }  ACE_DEBUG ((LM_DEBUG, "(%t) thread exiting.\n"));  return 0;}static void *run_mutex (void *){  for (int x = 0; x < 50; x++)    {      if (ACE_TOKEN_INVARIANTS::instance ()->mutex_acquired (mutexname) == 0)	ACE_ERROR_RETURN ((LM_ERROR, "mutex acquire violated invariant.\n"), 0);      ACE_DEBUG ((LM_DEBUG, "(%t) mutex acquired.\n"));      ACE_TOKEN_INVARIANTS::instance ()->mutex_releasing (mutexname);      if (ACE_TOKEN_INVARIANTS::instance ()->mutex_acquired (mutexname) == 0)	ACE_ERROR_RETURN ((LM_ERROR, "mutex renew violated invariant.\n"), 0);      ACE_DEBUG ((LM_DEBUG, "(%t) mutex renewed.\n"));            ACE_TOKEN_INVARIANTS::instance ()->mutex_releasing (mutexname);      ACE_DEBUG ((LM_DEBUG, "(%t) mutex released.\n"));    }  ACE_DEBUG ((LM_DEBUG, "(%t) thread exiting.\n"));  return 0;}static intrun_final_test (void){  ACE_DEBUG ((LM_DEBUG, "starting mutex tests 1 & 2\n"));  // Mutex tests.  if (ACE_TOKEN_INVARIANTS::instance ()->mutex_acquired ("testing mutex") == 0)    ACE_ERROR_RETURN ((LM_ERROR, "mutex test 1 failed.\n"), 0);  if (ACE_TOKEN_INVARIANTS::instance ()->mutex_acquired ("testing mutex2") == 0)    ACE_ERROR_RETURN ((LM_ERROR, "mutex test 2 failed.\n"), 0);  if (ACE_TOKEN_INVARIANTS::instance ()->mutex_acquired ("testing mutex") == 0)    ACE_DEBUG ((LM_DEBUG, "mutex test 1 succeeded.\n"));  else    ACE_ERROR_RETURN ((LM_ERROR, "mutex test 1 failed..\n"), 0);  if (ACE_TOKEN_INVARIANTS::instance ()->mutex_acquired ("testing mutex2") == 0)    ACE_DEBUG ((LM_DEBUG, "mutex test 2 succeeded.\n"));  else    ACE_ERROR_RETURN ((LM_ERROR, "mutex test 2 failed..\n"), 0);  // RW tests.  ACE_DEBUG ((LM_DEBUG, "starting rwlock tests 1 & 2\n"));  // Multiple readers.  if (ACE_TOKEN_INVARIANTS::instance ()->reader_acquired ("testing rwlock") == 0)    ACE_ERROR_RETURN ((LM_ERROR, "rwlock test 1 failed.\n"), 0);  if (ACE_TOKEN_INVARIANTS::instance ()->reader_acquired ("testing rwlock 2") == 0)    ACE_ERROR_RETURN ((LM_ERROR, "rwlock test 2 failed.\n"), 0);  if (ACE_TOKEN_INVARIANTS::instance ()->reader_acquired ("testing rwlock") == 0)    ACE_ERROR_RETURN ((LM_ERROR, "rwlock test 1 failed..\n"), 0);  if (ACE_TOKEN_INVARIANTS::instance ()->reader_acquired ("testing rwlock 2") == 0)    ACE_ERROR_RETURN ((LM_ERROR, "rwlock test 2 failed..\n"), 0);  // Writer.  if (ACE_TOKEN_INVARIANTS::instance ()->writer_acquired ("testing rwlock") == 0)    ACE_DEBUG ((LM_ERROR, "rwlock test 1 succeded.\n"));  else    ACE_ERROR_RETURN ((LM_ERROR, "rwlock test 1 failed...\n"), 0);  // Releasing reader.  ACE_TOKEN_INVARIANTS::instance ()->rwlock_releasing ("testing rwlock 2");  ACE_TOKEN_INVARIANTS::instance ()->rwlock_releasing ("testing rwlock 2");  // Writer.  if (ACE_TOKEN_INVARIANTS::instance ()->writer_acquired ("testing rwlock 2") == 0)    ACE_ERROR_RETURN ((LM_ERROR, "rwlock test 2 failed....\n"), 0);  // Reader.  if (ACE_TOKEN_INVARIANTS::instance ()->reader_acquired ("testing rwlock 2") == 0)    ACE_DEBUG ((LM_DEBUG, "rwlock test 2 succeeded.\n"));  else    ACE_ERROR_RETURN ((LM_ERROR, "rwlock test 2 failed.....\n"), 0);  return 0;}intmain (int /* argc */, char* /* argv */ []){  ACE_Thread_Manager mgr;  // Run reader/writer test  if (mgr.spawn_n (2, ACE_THR_FUNC (run_reader_writer),		   (void *) 0,		   THR_NEW_LWP | THR_DETACHED) == -1)    ACE_ERROR_RETURN ((LM_DEBUG, "%p\n", "spawn failed"), -1);  mgr.wait ();  ACE_OS::sleep (2);  // Run mutex test.  if (mgr.spawn_n (2, ACE_THR_FUNC (run_mutex),		   (void *) 0, 		   THR_NEW_LWP | THR_DETACHED) == -1)    ACE_ERROR_RETURN ((LM_DEBUG, "%p\n", "spawn failed"), -1);  mgr.wait ();  ACE_OS::sleep (2);  run_final_test ();  return 0;}#elseint main (int, char *[]){  ACE_ERROR_RETURN ((LM_ERROR, 		     "threads not supported on this platform\n"), -1);}#endif /* ACE_HAS_THREADS */

⌨️ 快捷键说明

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