ex2.cpp

来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 180 行

CPP
180
字号
// $Id: ex2.cpp 53169 2003-11-01 11:15:26Z dhinton $// ============================================================================//// = LIBRARY//   examples//// = FILENAME//   ex2.cpp//// = DESCRIPTION//    Example for using <ACE_UPIPE_SAP> and <ACE_Thread> for//    intra-process communication.//// = AUTHOR//    Gerhard Lenzer and Douglas C. Schmidt//// ============================================================================#include "ace/OS_main.h"#include "ace/UPIPE_Connector.h"#include "ace/UPIPE_Acceptor.h"#include "ace/Auto_Ptr.h"#include "ace/OS_NS_time.h"ACE_RCSID(UPIPE_SAP, ex2, "$Id: ex2.cpp 53169 2003-11-01 11:15:26Z dhinton $")#if defined (ACE_HAS_THREADS)// Data for testsuite.static int size = 0;static int iterations = 0;static void *supplier (void *){  ACE_UPIPE_Stream s_stream;  ACE_UPIPE_Addr c_addr (ACE_TEXT("pattern"));  ACE_Auto_Basic_Array_Ptr<char> mybuf (new char[size]);  for (int i = 0; i < size; i++)    mybuf[i] = 'a';  ACE_DEBUG ((LM_DEBUG,              "(%t) supplier starting connect thread\n"));  ACE_UPIPE_Connector con;  if (con.connect (s_stream, c_addr) == -1)    ACE_ERROR ((LM_ERROR,                "(%t) %p\n",                "ACE_UPIPE_Acceptor.connect failed"));  // Test asynchronicity (the "acausal principle" ;-)).  s_stream.enable (ACE_SIGIO);  ACE_Message_Block *mb_p;  for (int j = 0; j < iterations; j++)    {      ACE_NEW_RETURN (mb_p,                      ACE_Message_Block (size,                                         ACE_Message_Block::MB_DATA,                                         (ACE_Message_Block *) 0,                                         mybuf.get ()),                      0);      if (s_stream.send (mb_p) == -1)        ACE_ERROR_RETURN ((LM_ERROR,                           "(%t) %p\n",                           "send failed"),                          0);    }  ACE_NEW_RETURN (mb_p,                  ACE_Message_Block ((size_t) 0),                  0);  // Insert a 0-sized message block to signal the other side to shut  // down.  if (s_stream.send (mb_p) == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       "(%t) %p\n",                       "send failed"),                          0);  s_stream.close ();  return 0;}static void *consumer (void *){  ACE_UPIPE_Stream c_stream;  // Set the high water mark to size to achieve optimum performance.  int wm = size * iterations;  if (c_stream.control (ACE_IO_Cntl_Msg::SET_HWM,                        &wm) == -1)    ACE_DEBUG ((LM_DEBUG,                "set HWM failed\n"));  ACE_UPIPE_Addr serv_addr (ACE_TEXT("pattern"));  // accept will wait up to 4 seconds  ACE_UPIPE_Acceptor acc (serv_addr);  ACE_DEBUG ((LM_DEBUG,              "(%t) consumer spawning the supplier thread\n"));  // Spawn the supplier thread.  if (ACE_Thread_Manager::instance ()->spawn (ACE_THR_FUNC (supplier),                                              (void *) 0,                                              THR_NEW_LWP | THR_DETACHED) == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       "%p\n",                       "spawn"),                      0);  ACE_DEBUG ((LM_DEBUG,              "(%t) consumer starting accept\n"));  if (acc.accept (c_stream) == -1)    ACE_ERROR ((LM_ERROR,                "(%t) %p\n",                "ACE_UPIPE_Acceptor.accept failed"));  // Time measurement.  time_t currsec;  ACE_OS::time (&currsec);  time_t start = (time_t) currsec;  int received_messages = 0;  for (ACE_Message_Block *mb = 0;       c_stream.recv (mb) != -1 && mb->size () != 0;       mb->release ())    received_messages++;  ACE_OS::time (&currsec);  time_t secs = (time_t) currsec - start;  ACE_DEBUG ((LM_DEBUG,              "(%t) Transferred %d blocks of size %d\n"              "The program ran %d seconds\n",              received_messages, size, secs));  c_stream.close ();  return 0;}intACE_TMAIN (int argc, ACE_TCHAR *argv[]){  size = argc > 1 ? ACE_OS::atoi (argv[1]) : 32;  iterations = argc > 2 ? ACE_OS::atoi (argv[2]) : 16;  // Spawn the two threads.  if (ACE_Thread_Manager::instance ()->spawn (ACE_THR_FUNC (consumer),                                              (void *) 0,                                              THR_NEW_LWP | THR_DETACHED) == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       "%p\n",                       "spawn"),                      1);  // Wait for producer and consumer threads to exit.  ACE_Thread_Manager::instance ()->wait ();  return 0;}#elseintACE_TMAIN (int, ACE_TCHAR *[]){  ACE_ERROR_RETURN ((LM_ERROR,                     "threads not supported on this platform\n"),                     0);}#endif /* ACE_HAS_THREADS */

⌨️ 快捷键说明

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