📄 semaphore.cpp
字号:
// Semaphore.cpp,v 1.3 2004/05/10 18:50:00 shuston Exp#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) { shutdown (); mb->release (); return; } else { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Consumed %d\n"), *((int*)mb->rd_ptr ()))); mb->release(); } psema_.release (); } } void shutdown (void) { 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -