semaphore.cpp

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

CPP
150
字号
// $Id: Semaphore.cpp 78962 2007-07-20 03:27:14Z sowayaa $#include "ace/config-lite.h"#if defined (ACE_HAS_THREADS)#include "ace/OS_NS_string.h"#include "ace/Task.h"#include "ace/Synch.h"// Listing 2 code/ch14class Consumer : public ACE_Task<ACE_MT_SYNCH>{public:  enum { N_THREADS = 5 };  Consumer (ACE_Semaphore& psema, ACE_Semaphore& csema)    : psema_(psema), csema_(csema), exit_condition_(0)  { }  int svc (void)  {    while (!is_closed ())      consume_item ();    return 0;  }  void consume_item ()  {    csema_.acquire ();    if (!is_closed ())      {        ACE_Message_Block *mb;        this->getq (mb);        if (mb->msg_type () == ACE_Message_Block::MB_HANGUP)          {            this->shutdown ();            mb->release ();            return;          }        else          {            ACE_DEBUG ((LM_DEBUG,                        ACE_TEXT ("(%t) Consumed %d\n"),                        *((int*)mb->rd_ptr ())));            mb->release();          }        psema_.release ();      }  }  //FUZZ: disable check_for_lack_ACE_OS  void shutdown (void)  {  //FUZZ: enable check_for_lack_ACE_OS    exit_condition_ = 1;    this->msg_queue ()->deactivate ();    csema_.release (N_THREADS);  }  int is_closed (void)  {    return exit_condition_;  }private:  ACE_Semaphore& psema_;  ACE_Semaphore& csema_;  int exit_condition_;};// Listing 2// Listing 1 code/ch14class Producer : public ACE_Task_Base{public:  enum { MAX_PROD = 128 };  Producer (ACE_Semaphore& psema, ACE_Semaphore& csema,            Consumer &consumer)      : psema_(psema), csema_(csema), consumer_(consumer)  { }  int svc (void)  {    for (int i = 0; i <= MAX_PROD; i++)      produce_item (i);    hang_up ();    return 0;  }  void produce_item (int item)  {    psema_.acquire ();    ACE_Message_Block *mb      = new ACE_Message_Block (sizeof (int),                               ACE_Message_Block::MB_DATA);    ACE_OS::memcpy (mb->wr_ptr (), &item, sizeof item);    mb->wr_ptr (sizeof (int));    this->consumer_.putq (mb);    ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Produced %d\n"), item));    csema_.release();  }  void hang_up ()  {    psema_.acquire ();    ACE_Message_Block *mb =      new ACE_Message_Block (0, ACE_Message_Block::MB_HANGUP);    this->consumer_.putq (mb);    csema_.release ();  }private:  ACE_Semaphore& psema_;  ACE_Semaphore& csema_;  Consumer& consumer_;};// Listing 1// Listing 3 code/ch14int ACE_TMAIN (int, ACE_TCHAR *[]){  ACE_Semaphore psem (5);  ACE_Semaphore csem (0);  Consumer consumer (psem, csem);  Producer producer (psem, csem, consumer);  producer.activate ();  consumer.activate (THR_NEW_LWP | THR_JOINABLE,                     Consumer::N_THREADS);  producer.wait ();  consumer.wait ();  return 0;}// Listing 3#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 */

⌨️ 快捷键说明

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