⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rw_locks.cpp

📁 ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework)
💻 CPP
字号:
// rw_locks.cpp,v 4.11 2003/11/01 11:15:24 dhinton Exp// ============================================================================//// = LIBRARY//    examples// // = FILENAME//    rw_locks.cpp//// = DESCRIPTION//    test_rw_locks shows how to use ACE_Local_RLock, ACE_Local_WLock,//    ACE_Remote_RLock, and ACE_Remote_WLock.//// = AUTHOR//    Tim Harrison// // ============================================================================#include "ace/Get_Opt.h"#include "ace/Local_Tokens.h"#include "ace/Remote_Tokens.h"#include "ace/Thread_Manager.h"#include "ace/Token_Invariants.h"#if defined (ACE_HAS_THREADS) && defined (ACE_HAS_THREADS_LIBRARY)ACE_RCSID(rw_lock, rw_locks, "rw_locks.cpp,v 4.11 2003/11/01 11:15:24 dhinton Exp")typedef ACE_Token_Invariant_Manager ACE_TOKEN_INVARIANTS;static ACE_Token_Proxy *global_rlock;static ACE_Token_Proxy *global_wlock;static const char *server_host = ACE_DEFAULT_SERVER_HOST;static int server_port = ACE_DEFAULT_SERVER_PORT;static int ignore_deadlock = 0;static int threads = 2;static int iterations = 50;static int debug = 0;static int remote = 0;static int reads = 4;static int write_sleep = 0;static int renew = 0;static void *run_thread (void *){  for (int x = 0; x < iterations; x++)    {      int y = 0;      for (; y < reads; y++)	{	  if (global_rlock->acquire () == -1) 	    {	      if (ACE_Log_Msg::instance ()->errnum () == EDEADLK)		{		  ACE_DEBUG ((LM_DEBUG, "rlock deadlock detected\n"));		  goto READ_DEADLOCK;		}	      else return 0;	    }	  if (ACE_TOKEN_INVARIANTS::instance ()->acquired (global_rlock) == 0)	    ACE_ERROR_RETURN ((LM_ERROR, "reader acquire violated invariant.\n"), 0);	  ACE_DEBUG ((LM_DEBUG, "(%t) rlock acquired.\n"));	}      if (renew)	{	  ACE_TOKEN_INVARIANTS::instance ()->releasing (global_rlock);	  if (global_rlock->renew () == -1)	    {	      if (ACE_Log_Msg::instance ()->errnum () == EDEADLK)		{		  ACE_DEBUG ((LM_DEBUG, "rlock deadlock detected during renew\n"));		  goto READ_DEADLOCK;		}	      else return 0;	    }	  ACE_DEBUG ((LM_DEBUG, "(%t) rlock renewed.\n"));	  if (ACE_TOKEN_INVARIANTS::instance ()->acquired (global_rlock) == 0)	    ACE_ERROR_RETURN ((LM_ERROR, "reader renew violated invariant.\n"), 0);	}    READ_DEADLOCK:            for (; y > 0; y--)	{	  ACE_TOKEN_INVARIANTS::instance ()->releasing (global_rlock);	  if (global_rlock->release () == 0)	    ACE_DEBUG ((LM_DEBUG, "(%t) r-released.\n"));	}      if (global_wlock->acquire () == -1) 	ACE_DEBUG ((LM_DEBUG, "wlock deadlock detected\n"));      else	{	  if (write_sleep)	    ACE_OS::sleep (1);	  ACE_DEBUG ((LM_DEBUG, "\t\t(%t) wlock acquired.\n"));	  if (ACE_TOKEN_INVARIANTS::instance ()->acquired (global_wlock) == 0)	    ACE_ERROR_RETURN ((LM_ERROR, "writer acquire violated invariant.\n"), 0);	  if (renew)	    {	      ACE_TOKEN_INVARIANTS::instance ()->releasing (global_wlock);	      if (global_wlock->renew () == -1)		{		  if (ACE_Log_Msg::instance ()->errnum () == EDEADLK)		    {		      ACE_DEBUG ((LM_DEBUG, "wlock deadlock detected during renew\n"));		    }		  else return 0;		}	      ACE_DEBUG ((LM_DEBUG, "(%t) rlock renewed.\n"));	      if (ACE_TOKEN_INVARIANTS::instance ()->acquired (global_wlock) == 0)		ACE_ERROR_RETURN ((LM_ERROR, "writer renew violated invariant.\n"), 0);	    }	  ACE_TOKEN_INVARIANTS::instance ()->releasing (global_wlock);	  if (global_wlock->release () == 0)	    ACE_DEBUG ((LM_DEBUG, "\t\t(%t) w-released.\n"));	}    }  ACE_DEBUG ((LM_DEBUG, "(%t) thread exiting.\n"));  return 0;}static intparse_args (int argc, char *argv[]){  ACE_LOG_MSG->open (argv[0], ACE_Log_Msg::STDERR); // | ACE_Log_Msg::VERBOSE);  ACE_Get_Opt get_opt (argc, argv, "t:iun:dr:sp:h:R", 1);  for (int c; (c = get_opt ()) != -1; )    {      switch (c)	{	case 'h':  // specify the host machine on which the server is running	  server_host = get_opt.opt_arg ();	  remote = 1;	  break;	case 'p':  // specify the port on which the server is running	  server_port = ACE_OS::atoi (get_opt.opt_arg ());	  remote = 1;	  break;	case 't':	  threads = ACE_OS::atoi (get_opt.opt_arg ());	  break;	case 'R':	  renew = 1;	  break;	case 'r':	  reads = ACE_OS::atoi (get_opt.opt_arg ());	  break;	case 'd':	  debug = 1;	  break;	case 's':	  write_sleep = 1;	  break;	case 'n':	  iterations = ACE_OS::atoi (get_opt.opt_arg ());	  break;	case 'i':	  ignore_deadlock = 1;	  break;	case 'u':	  // usage: fallthrough	default:	  ACE_ERROR_RETURN ((LM_ERROR, 			    "%n:\n"			     "[-h <remote host>]\n"			     "[-p <remote port>]\n"			     "[-i ignore deadlock]\n"			     "[-n <iterations>]\n"			     "[-R perform renews]\n"			     "[-r <reads>]\n"			     "[-d debug]\n"			     "[-s sleep during writes]\n"			     "[-t <threads>\n", 1), -1);	}    }  return 0;}#if defined (ACE_HAS_PTHREADS)#define SUSPEND 0#else#define SUSPEND THR_SUSPENDED#endifintmain (int argc, char* argv[]){  if (parse_args (argc, argv) == -1)    return -1;  if (remote)    {      ACE_Remote_Mutex::set_server_address (ACE_INET_Addr (server_port, server_host));      global_rlock = (ACE_Token_Proxy *) new 	ACE_Remote_RLock ("THE_TOKEN", ignore_deadlock, debug);      global_wlock = (ACE_Token_Proxy *) new 	ACE_Remote_WLock ("THE_TOKEN", ignore_deadlock, debug);    }  else    {      global_rlock = (ACE_Token_Proxy *) new 	ACE_Local_RLock ("THE_TOKEN", ignore_deadlock, debug);      global_wlock = (ACE_Token_Proxy *) new 	ACE_Local_WLock ("THE_TOKEN", ignore_deadlock, debug);    }  ACE_Thread_Manager mgr;  if (mgr.spawn_n (threads, ACE_THR_FUNC (run_thread),		   (void *) 0, 		   THR_BOUND | SUSPEND) == -1)    ACE_ERROR_RETURN ((LM_DEBUG, "%p\n", "spawn failed"), -1);#if ! defined (ACE_HAS_PTHREADS)  if (mgr.resume_all () == -1)    ACE_ERROR_RETURN ((LM_DEBUG, "%p\n", "resume failed"), -1);#endif  mgr.wait ();  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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -