mif.cpp
来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 186 行
CPP
186 行
// $Id: MIF.cpp 72208 2006-04-20 11:30:35Z jwillemsen $#include "ace/ACE.h"#include "ace/Auto_Ptr.h"#include "ace/Task.h"#include "ace/Sched_Params.h"#include "ace/Atomic_Op.h"#include "ace/High_Res_Timer.h"#include "ace/Barrier.h"#include "ace/Lock_Adapter_T.h"#include "ace/Countdown_Time.h"#include "Kokyu_dsrt.h"ACE_Atomic_Op<ACE_SYNCH_MUTEX, long> guid=0;struct mif_scheduler_traits{ typedef int Guid_t; struct QoSDescriptor_t { typedef long Importance_t; long importance_; }; /* static Time_t now() { ACE_Time_Value now = ACE_OS::gettimeofday (); return now.sec () * 10000000 + now.usec () * 10; } */ typedef Kokyu::MIF_Comparator<QoSDescriptor_t> QoSComparator_t; struct Guid_Hash { u_long operator () (const Guid_t& guid) { return guid; } };};class MyTask : public ACE_Task_Base{public: MyTask (ACE_Barrier& bar, Kokyu::DSRT_Dispatcher<mif_scheduler_traits>* dispatcher, mif_scheduler_traits::QoSDescriptor_t& qos, int exec_duration) :barrier_ (bar), dispatcher_ (dispatcher), qos_ (qos), guid_ (++guid), exec_duration_ (exec_duration) {} int svc (void); private: ACE_Barrier& barrier_; Kokyu::DSRT_Dispatcher<mif_scheduler_traits>* dispatcher_; mif_scheduler_traits::QoSDescriptor_t qos_; mif_scheduler_traits::Guid_t guid_; int exec_duration_;};int MyTask::svc (void){ ACE_hthread_t thr_handle; ACE_Thread::self (thr_handle); ACE_DEBUG ((LM_DEBUG, "(%t|%T): task activated\n")); ACE_ASSERT (dispatcher_ != 0); (void) dispatcher_->schedule (guid_, qos_); barrier_.wait (); long prime_number = 9619899; ACE_High_Res_Timer timer; ACE_Time_Value elapsed_time; ACE_Time_Value seconds_tracker(0,0); ACE_Time_Value one_second (1,0); ACE_Time_Value compute_count_down_time (exec_duration_, 0); ACE_Countdown_Time compute_count_down (&compute_count_down_time); timer.start (); while (compute_count_down_time > ACE_Time_Value::zero) { ACE::is_prime (prime_number, 2, prime_number / 2); compute_count_down.update (); timer.stop (); timer.elapsed_time (elapsed_time); seconds_tracker += elapsed_time; if (seconds_tracker >= one_second) { seconds_tracker.set (0,0); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Currently running guid=%d") ACE_TEXT (", qos_.importance=%d \n"), guid_, qos_.importance_)); } timer.reset (); timer.start (); } dispatcher_->cancel_schedule (this->guid_); return 0;}int ACE_TMAIN (int,ACE_TCHAR**){ Kokyu::DSRT_ConfigInfo config_info; // config_info.scheduler_type_ = Kokyu::SCHED_MIF; config_info.impl_type_ = Kokyu::DSRT_OS_BASED; ACE_Barrier bar (3); ACE_DEBUG ((LM_DEBUG, "before create_dispatcher\n" )); config_info.sched_strategy_ = Kokyu::DSRT_MIF; Kokyu::DSRT_Dispatcher_Factory<mif_scheduler_traits>::DSRT_Dispatcher_Auto_Ptr disp (Kokyu::DSRT_Dispatcher_Factory<mif_scheduler_traits>:: create_DSRT_dispatcher (config_info)); ACE_DEBUG ((LM_DEBUG, "after create_dispatcher\n" )); ACE_ASSERT (disp.get () != 0); mif_scheduler_traits::QoSDescriptor_t qos1, qos2, qos3; qos1.importance_ = 1; qos2.importance_ = 2; qos3.importance_ = 3; MyTask mytask1 (bar, disp.get (), qos1, 15); MyTask mytask2 (bar, disp.get (), qos2, 6); MyTask mytask3 (bar, disp.get (), qos3, 4); long flags = THR_BOUND | THR_SCHED_FIFO; if (mytask1.activate (flags) == -1) { flags = THR_BOUND; if (mytask1.activate (flags) == -1) ACE_ERROR ((LM_ERROR, "EC (%P|%t) cannot activate task\n")); } if (mytask2.activate (flags) == -1) { flags = THR_BOUND; if (mytask2.activate (flags) == -1) ACE_ERROR ((LM_ERROR, "EC (%P|%t) cannot activate task\n")); } if (mytask3.activate (flags) == -1) { flags = THR_BOUND; if (mytask3.activate (flags) == -1) ACE_ERROR ((LM_ERROR, "EC (%P|%t) cannot activate task\n")); } disp->shutdown (); ACE_DEBUG ((LM_DEBUG, "main thread exiting\n")); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?