ãã®èšäºã¯äœã«ã€ããŠã§ããïŒ
C ++ SObjectizerãã¬ãŒã ã¯ãŒã¯ã®äž»ãªç¹åŸŽã®1ã€ã¯ã ãã£ã¹ãããã£ãŒã®å¯çšæ§ã§ãã ãã£ã¹ãããã£ã¯ãã¢ã¯ã¿ãŒïŒSObjectizerã®çšèªã§ã¯ãšãŒãžã§ã³ãïŒãã€ãã³ããåŠçããå Žæãšæ¹æ³ã決å®ããŸãïŒå¥ã®ã¹ã¬ãããäœæ¥ã¹ã¬ããã®ããŒã«ãã¢ã¯ã¿ãŒã®ã°ã«ãŒãã«å ±éãã1ã€ã®ã¹ã¬ãããªã©ã
SObjectizerã®æ§é ã«ã¯ããã§ã«8ã€ã®ãã«ã¿ã€ã ãã£ã¹ãããã£ãŒãå«ãŸããŠããŸãïŒããã«ãSObjectizerã®æ¡åŒµã»ããã«ãã1ã€ãããŸãïŒã ããããããããå€æ§æ§ã«ãããããããç¹å®ã®ç¹å®ã®ã¿ã¹ã¯ã®ããã«ç¬èªã®ãã£ã¹ãããã£ãäœæããããšãçã«ããªã£ãŠããå ŽåããããŸãã ãã®èšäºã§ã¯ããããã®ç¶æ³ã®1ã€ãåãäžããäœããã®çç±ã§éåžžã®ãã£ã¹ãããã£ãç§ãã¡ã«åããªãå Žåã«ãç¬èªã®ãã£ã¹ãããã£ãäœæããæ¹æ³ã瀺ããŸãã ãŸããåãã¢ã¯ã¿ãŒãç°ãªããã£ã¹ãããã£ã«ãªã³ã¯ããã ãã§ãã¢ããªã±ãŒã·ã§ã³ã®åäœãç°¡åã«å€æŽã§ããããšã瀺ãããŸãã ãŸããããã€ãã®ããèå³æ·±ãããããªããšãšããããªããšã§ã¯ãããŸããã
äžè¬çã«ãC ++åãã®æ°å°ãªãçããŠãããéçºäžã®ã¢ã¯ã¿ãŒãã¬ãŒã ã¯ãŒã¯ã®å®è£ ã®è©³çŽ°ã«èå³ããã人ã¯ãå®å šã«èªã¿é²ããããšãã§ããŸãã
åæ
æè¿ãSObjectizerã®ãŠãŒã¶ãŒã®1人ããSObjectizerã®äœ¿çšäžã«å¯ŸåŠããªããã°ãªããªãã£ãç¹å®ã®åé¡ã«ã€ããŠè©±ããŸããã ãã€ã³ãã¯ãSObjectizerãšãŒãžã§ã³ãã«åºã¥ããŠãã³ã³ãã¥ãŒã¿ãŒã«æ¥ç¶ãããããã€ã¹ã管çããããã®ã¢ããªã±ãŒã·ã§ã³ãéçºãããŠããããšã§ãã äžéšã®æäœïŒã€ãŸããããã€ã¹ã®åæåããã³ååæåæäœïŒã¯åæçã«å®è¡ãããŸããããã«ããããã°ããã®éãäœæ¥ã¹ã¬ããããããã¯ãããŸãã I / Oæäœã¯éåæã§ãããããèªã¿åã/æžã蟌ã¿ã®éå§ãšèªã¿åã/æžã蟌ã¿çµæã®åŠçã¯éåžžã«é«éã§ãé·æéã«ããã£ãŠäœæ¥ã¹ã¬ããããããã¯ããŸããã
æ°çŸããæ°åã®ããã€ã¹ãå€æ°ãããããã1ã€ã®ããã€ã¹-1ã€ã®äœæ¥ã¹ã¬ãããã¹ããŒã ã䜿çšããããšã¯æçã§ã¯ãããŸããã ãã®ãããäœæ¥ã¹ã¬ããã®å°ããªããŒã«ã䜿çšãããããã€ã¹äžã§ãã¹ãŠã®æäœãå®è¡ãããŸãã
ãããããã®ãããªåçŽãªã¢ãããŒãã«ã¯äžå¿«ãªæ©èœããããŸãã ããã€ã¹ã®åæåãšååæåã®ããã®å€æ°ã®ã¢ããªã±ãŒã·ã§ã³ãçºçãããšããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ããŒã«ã®ãã¹ãŠã®ã¹ã¬ããã«åæ£ããå§ããŸãã ãŸããèªã¿åã/æžã蟌ã¿ãªã©ã®çãæäœããã¥ãŒã«èç©ãããé·æéåŠçãããªãã®ã«ãããŒã«ã®ãã¹ãŠã®äœæ¥ã¹ã¬ãããé·ãæäœã®å®è¡ã§ããžãŒã«ãªããšãç¶æ³ãå®æçã«çºçããŸãã ãã®ç¶æ³ã¯ãããšãã°ãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæãããã€ã¹ãåæåããããã®ã¢ããªã±ãŒã·ã§ã³ã®å€§ããªããã³ãã«ããããã«åœ¢æããããšããå®å®ããŠèŠ³å¯ãããŸãã ãããŠããã®ããã³ãã«ããå解ããããŸã§ããã§ã«åæåãããããã€ã¹ã§ã®I / Oæäœã¯å®è¡ãããŸããã
ãã®åé¡ã解æ¶ããã«ã¯ãããã€ãã®ã¢ãããŒãã䜿çšã§ããŸãã ãã®èšäºã§ã¯ããããã®1ã€ãåæããŸããã€ãŸããã¢ããªã±ãŒã·ã§ã³ã®ã¿ã€ããåæããç¬èªã®cãªthread_poolãã£ã¹ãããã£ãŒãäœæããŸãã
äœãéæãããã§ããïŒ
åé¡ã¯ãé·æéå®è¡ããããã³ãã©ãŒïŒã€ãŸããããã€ã¹ãåæåããã³ååæåããããã®ãã³ãã©ãŒïŒãããŒã«å ã®ãã¹ãŠã®äœæ¥ã¹ã¬ããããããã¯ãããã®èŠæ±ã®ããã«ãçãæäœïŒã€ãŸããI / OïŒãåŸ æ©ã§ããããšã§ããã¥ãŒã¯éåžžã«é·ãã§ãã ãã®ãããªã¹ã±ãžã¥ãŒãªã³ã°ã¹ããŒã ãååŸããŠãçãæäœã®ãªã¯ãšã¹ãã衚瀺ããããšãã«ããã¥ãŒã§ã®åŸ æ©ãæå°éã«ãªãããã«ããŸãã
æš¡é ãã¹ã¿ã³ãã
ãã®èšäºã§ã¯ã äžèšã®åé¡ã®æš¡å£ã䜿çšããŸãã ãªãåœç©ãªã®ãïŒ ç¬¬äžã«ããŠãŒã¶ãŒã®åé¡ã®æ¬è³ªã«ã€ããŠã®ã¢ã€ãã¢ãããããŸãããã詳现ãããããã圌ã®ã³ãŒããèŠãããšããªãããã§ãã ãŸããæš¡å£ã«ãããå®éã®è£œåã³ãŒãã«ã¯éåžžã«å€ããã现ããéšåã«æ³šæãæ£ããããšãªãã解決ããåé¡ã®æãéèŠãªåŽé¢ã«éäžããããšãã§ããŸãã
ãã ãããŠãŒã¶ãŒããåŠãã éèŠãªè©³çŽ°ã1ã€ãããããã¯ä»¥äžã§èª¬æãããœãªã¥ãŒã·ã§ã³ã«æãæ·±å»ãªåœ±é¿ãåãŒããŸãã å®éãSObjectizerã«ã¯ã¡ãã»ãŒãžãã³ãã©ãŒã®ã¹ã¬ããã»ãŒãã®æŠå¿µããããŸãã ã€ãŸã ã¡ãã»ãŒãžãã³ãã©ãŒãã¹ã¬ããã»ãŒããšããŠããŒã¯ãããŠããå ŽåãSObjectizerã¯ä»ã®ã¹ã¬ããã»ãŒããã³ãã©ãŒãšäžŠè¡ããŠãã®ãã³ãã©ãŒãå®è¡ããæš©å©ãæã¡ãŸãã ãããŠããŸãã«ãããè¡ãadv_thread_poolãã£ã¹ãããã£ãŒããããŸãã
ãã®ããããŠãŒã¶ãŒã¯adv_thread_poolãã£ã¹ãããã£ãŒã«é¢é£ä»ããããã¹ããŒãã¬ã¹ãšãŒãžã§ã³ãã䜿çšããŠããã€ã¹ã管çããŸããã ããã«ããããããã³å šäœãå€§å¹ ã«ç°¡çŽ åãããŸãã
ããã§ãç§ãã¡ã¯äœãæ€èšããã€ããã§ããïŒ
åããšãŒãžã§ã³ããããªãæš¡é åãäœæããŸããã 1ã€ã®ãšãŒãžã§ã³ãã¯ãã¿ã€ãa_dashboard_tã®è£å©ãšãŒãžã§ã³ãã§ãã ãã®ã¿ã¹ã¯ã¯ãã·ãã¥ã¬ãŒã·ã§ã³å®éšã®çµæãå€æããããã®çµ±èšãåéããŠèšé²ããããšã§ãã ãã®ãšãŒãžã§ã³ãã®å®è£ ã«ã€ããŠã¯èæ ®ããŸããã
a_device_manager_tã¯ã©ã¹ã«ãã£ãŠå®è£ ããã 2çªç®ã®ãšãŒãžã§ã³ãã¯ãããã€ã¹ã®æäœãã·ãã¥ã¬ãŒãããŸãã ãã®ãšãŒãžã§ã³ããã©ã®ããã«æ©èœãããã«ã€ããŠå°ãã話ããŸãã ããã¯ãç¶æ ãå€æŽããå¿ èŠã®ãªããšãŒãžã§ã³ããSObjectizerã«å®è£ ããæ¹æ³ã®èå³æ·±ãäŸã§ãã
ã·ãã¥ã¬ãŒã·ã§ã³ã«ã¯ãã»ãŒåãããšãè¡ã2ã€ã®ã¢ããªã±ãŒã·ã§ã³ãå«ãŸããŠããŸããã³ãã³ãã©ã€ã³åŒæ°ã解æããa_dashboard_tããã³a_device_manager_tãšãŒãžã§ã³ãã䜿çšããŠã·ãã¥ã¬ãŒã·ã§ã³ãéå§ããŸãã ãã ããæåã®ã¢ããªã±ãŒã·ã§ã³ã¯a_device_manager_tãadv_thread_poolãããŒãžã£ãŒã«ãã€ã³ãããŸãã ãããã2çªç®ã®ã¢ããªã±ãŒã·ã§ã³ã¯ç¬èªã®ã¿ã€ãã®ãã£ã¹ãããã£ãŒãå®è£ ããa_device_manager_tããã®ç¬èªã®ãã£ã¹ãããã£ãŒã«ãã€ã³ãããŸãã
åã¢ããªã±ãŒã·ã§ã³ã®çµæã«åºã¥ããŠãããŸããŸãªã¿ã€ãã®ãã£ã¹ãããã£ããµãŒãã¹ã¢ããªã±ãŒã·ã§ã³ã®æ§è³ªã«ã©ã®ããã«åœ±é¿ãããã確èªã§ããŸãã
ãšãŒãžã§ã³ãa_device_manager_t
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãa_device_manager_tãšãŒãžã§ã³ãã®å®è£ ã«ãããäž»èŠãªãã€ã³ãã匷調ããŠã¿ãŸãã ä»ã®ãã¹ãŠã®è©³çŽ°ã¯ãå®å šãªãšãŒãžã§ã³ãã³ãŒãã§ç¢ºèªã§ããŸã ã ãŸãã¯ãã³ã¡ã³ãã§æ確ã«ããŸãã
a_device_manager_tãšãŒãžã§ã³ãã¯ãåãã¿ã€ãã®å€ãã®ããã€ã¹ã§ã®åäœãã·ãã¥ã¬ãŒãããå¿ èŠããããŸãããåæã«ãã¹ããŒãã¬ã¹ãšãŒãžã§ã³ãããã€ãŸã ãã®éçšã§èªåã®ç¶æ ãå€ããŠã¯ãªããŸããã ãŸãã«ããšãŒãžã§ã³ãã¯ãã®ç¶æ ãå€æŽãããã¹ã¬ããã»ãŒããªã€ãã³ããã³ãã©ãŒãæã€ããšãã§ããŸãã
ãã ããa_device_manager_tãšãŒãžã§ã³ããç¶æ ãå€æŽããªãå Žåãã©ã®ããã€ã¹ãåæåããå¿ èŠãããããã©ã®ããã€ã¹ãååæåããå¿ èŠãããããã©ã®ããã€ã¹I / Oæäœãå®è¡ããããã©ã®ããã«æ±ºå®ããŸããïŒ ç°¡åã§ãããã®æ å ±ã¯ãã¹ãŠãa_device_manager_tãšãŒãžã§ã³ããããèªäœã«éä¿¡ããã¡ãã»ãŒãžå ã§éä¿¡ãããŸãã
éå§æã«ãa_device_manager_tãšãŒãžã§ã³ãã¯èªèº«ã«Nåã®init_device_tã¡ãã»ãŒãžãéä¿¡ããŸãã ãã®ãããªã¡ãã»ãŒãžãåä¿¡ãããšãa_device_manager_tãšãŒãžã§ã³ãã¯ãdeviceãã®ã€ã³ã¹ã¿ã³ã¹ïŒdevice_tåã®ãªããžã§ã¯ãïŒãäœæããåæåããŸãã 次ã«ããã®ã€ã³ã¹ã¿ã³ã¹ããã€ã³ããããšãperform_io_tã¡ãã»ãŒãžã§éä¿¡ãããŸãã 次ã®ããã«ãªããŸãã
void on_init_device(mhood_t<init_device_t> cmd) const { // . handle_msg_delay(a_dashboard_t::op_type_t::init, *cmd); // , // . auto dev = std::make_unique<device_t>(cmd->id_, calculate_io_period(), calculate_io_ops_before_reinit(), calculate_reinits_before_recreate()); std::this_thread::sleep_for(args_.device_init_time_); // IO- // . send_perform_io_msg(std::move(dev)); }
perform_io_tã¡ãã»ãŒãžãåä¿¡ãããšãa_device_manager_tãšãŒãžã§ã³ãã¯ããã€ã¹ã®I / Oæäœãã·ãã¥ã¬ãŒãããŸãããã€ã³ã¿ãŒã¯ãperform_io_tã¡ãã»ãŒãžå ã«é 眮ãããŸãã åæã«ãdevice_tã®IOæäœã®ã«ãŠã³ã¿ãŒãæžå°ããŸãã ãã®ã«ãŠã³ã¿ãŒããŒãã«éãããšãa_device_manager_tã¯reinit_device_tã¡ãã»ãŒãžïŒååæåã«ãŠã³ã¿ãŒããŸã ãªã»ãããããŠããªãå ŽåïŒãéä¿¡ããããããã€ã¹ãåäœæããããã®init_device_tã¡ãã»ãŒãžãéä¿¡ããŸãã ãã®åçŽãªããžãã¯ã¯ãåºå·ããïŒã€ãŸããéåžžã®IOæäœã®å®è¡ãåæ¢ããïŒæ©èœãåããå®éã®ããã€ã¹ã®åäœãæš¡å£ããŠãããããååæåããå¿ èŠããããŸãã ãŸããåããã€ã¹ã®ãªãœãŒã¹ãéãããŠãããããããã€ã¹ã亀æããå¿ èŠããããšããæ²ããäºå®ããããŸãã
IOæäœã®ã«ãŠã³ã¿ãŒããŸã ãªã»ãããããŠããªãå ŽåããšãŒãžã§ã³ãa_device_manager_tã¯ããäžåºŠã¡ãã»ãŒãžperform_io_tãéä¿¡ããŸãã
ã³ãŒãã§ã¯ããã¹ãŠæ¬¡ã®ããã«ãªããŸãã
void on_perform_io(mutable_mhood_t<perform_io_t> cmd) const { // . handle_msg_delay(a_dashboard_t::op_type_t::io_op, *cmd); // IO-. std::this_thread::sleep_for(args_.io_op_time_); // IO- . cmd->device_->remaining_io_ops_ -= 1; // , . // , . if(0 == cmd->device_->remaining_io_ops_) { if(0 == cmd->device_->remaining_reinits_) // . . so_5::send<init_device_t>(*this, cmd->device_->id_); else // . so_5::send<so_5::mutable_msg<reinit_device_t>>(*this, std::move(cmd->device_)); } else // , IO-. send_perform_io_msg(std::move(cmd->device_)); }
以äžã«ããã®ãããªåçŽãªããžãã¯ã瀺ããŸããããã«ã€ããŠã詳现ãæ確ã«ããããšãçã«ããªã£ãŠããŸãã
a_dashboard_tãšãŒãžã§ã³ããžã®æ å ±ã®éä¿¡
ã¡ãã»ãŒãžãã³ãã©ãŒinit_device_tãreinit_device_tãperform_io_tã§ã¯ãæåã®è¡ã¯åæ§ã®æ§æã§ãã
handle_msg_delay(a_dashboard_t::op_type_t::init, *cmd);
ããã¯ãç¹å®ã®ã¡ãã»ãŒãžãèŠæ±ãã¥ãŒã§è²»ãããéã«é¢ããæ å ±ã®ãšãŒãžã§ã³ãa_dashboard_tãžã®è»¢éã§ãã ãã®æ å ±ã«åºã¥ããŠãçµ±èšãæ£ç¢ºã«æ§ç¯ãããŸãã
ååãšããŠãã¡ãã»ãŒãžãã¢ããªã±ãŒã·ã§ã³ãã¥ãŒã«è²»ããããæéã«é¢ããæ£ç¢ºãªæ å ±ã¯ãSObjectizerã®å èã«äŸµå ¥ããããšã«ãã£ãŠã®ã¿ååŸã§ããŸãããã®åŸãã¢ããªã±ãŒã·ã§ã³ããã¥ãŒã«é 眮ããæéãšããããæœåºããæéãä¿®æ£ã§ããŸãã ãããããã®ãããªåçŽãªå®éšã§ã¯ããã®ãããªæ¥µç«¯ãªã¹ããŒãã«ã¯åŸäºããŸããã ãã£ãšç°¡åã«ããŸãããã次ã®ã¡ãã»ãŒãžãéä¿¡ãããšãã«ãã¡ãã»ãŒãžã®äºæ³å°çæéãä¿åããŸãã ããšãã°ã250msé 延ããã¡ãã»ãŒãžãéä¿¡ããå Žåããã®æç¹ïŒTc + 250msïŒã§ã¡ãã»ãŒãžãå°çããã®ãåŸ ã¡ãŸããTcã¯çŸåšã®æå»ã§ãã ã¡ãã»ãŒãžãéä¿¡ãããå ŽåïŒTc + 350msïŒããã¥ãŒã§100msãè²»ãããŸããã
ãã¡ãããããã¯æ£ç¢ºãªæ¹æ³ã§ã¯ãããŸããããæš¡å£ã«éåžžã«é©ããŠããŸãã
çŸåšã®äœæ¥ã¹ã¬ããããã°ãããããã¯ãã
ãŸããã¡ãã»ãŒãžãã³ãã©init_device_tãreinit_device_tãperform_io_tã®ã³ãŒãã§ã¯ãstd :: this_thread :: sleep_forã®åŒã³åºãã確èªã§ããŸãã ããã¯ãçŸåšã®ã¹ã¬ããããããã¯ããããã€ã¹ãšã®åææäœã®ã·ãã¥ã¬ãŒã·ã§ã³ã«éããŸããã
é 延æéã¯ã³ãã³ãã©ã€ã³ããèšå®ã§ããããã©ã«ãã§ã¯æ¬¡ã®å€ã䜿çšãããŸãïŒinit_device_t-1250msãperform_io_t-50msã reinit_device_tã®æéã¯ãinit_deviceã®æéã®2/3ãšããŠèšç®ãããŸãïŒã€ãŸããããã©ã«ãã§833msïŒã
å¯å€ã¡ãã»ãŒãžã䜿çšãã
ãããããa_device_manager_tãšãŒãžã§ã³ãã®æãèå³æ·±ãæ©èœã¯ãåçã«äœæãããdevice_tãªããžã§ã¯ãã®æå¹æéãã©ã®ããã«æäŸããããã§ãã çµå±ãinit_device_tã®åŠçäžã«device_tã€ã³ã¹ã¿ã³ã¹ãåçã«äœæããããã®ããã€ã¹ãååæåããè©Šã¿ãå°œãããŸã§çãç¶ããå¿ èŠããããŸãã ãŸããååæåã®è©Šè¡ãå°œãããšãdevice_tã€ã³ã¹ã¿ã³ã¹ãç Žæ£ããå¿ èŠããããŸãã
åæã«ãa_device_manager_tã¯ç¶æ ãå€æŽããªãã§ãã ããã ã€ãŸã a_device_manager_tã«ã¯ãããçš®ã®std :: mapãŸãã¯std :: unordered_mapãååŸã§ããŸãããããã¯ãçããŠããdevice_tã®èŸæžã«ãªããŸãã
ãã®åé¡ã解決ããã«ã¯ã次ã®ããªãã¯ã䜿çšããŸãã reinit_device_tããã³perform_io_tã¡ãã»ãŒãžã«ã¯ãdevice_tã€ã³ã¹ã¿ã³ã¹ãžã®ãã€ã³ã¿ãŒãå«ãunique_ptrãå«ãŸããŠããŸãã ãããã£ãŠãreinit_device_tãŸãã¯perform_io_tãåŠçãããã®ããã€ã¹ã®æ¬¡ã®ã¡ãã»ãŒãžãéä¿¡ããå Žåãunique_ptrãå€ãã¡ãã»ãŒãžã€ã³ã¹ã¿ã³ã¹ããæ°ããã€ã³ã¹ã¿ã³ã¹ã«åã«è»¢éããŸãã ã€ã³ã¹ã¿ã³ã¹ãäžèŠã«ãªã£ãå Žåãã€ãŸã reinit_device_tãŸãã¯perform_io_tãéä¿¡ããªããªã£ããããdevice_tã€ã³ã¹ã¿ã³ã¹ã¯èªåçã«ç Žæ£ãããŸãã ãã§ã«åŠçãããã¡ãã»ãŒãžã®unique_ptrã€ã³ã¹ã¿ã³ã¹ã¯ç Žæ£ãããŸãã
ããããã¡ãã£ãšããããªãã¯ããããŸãã éåžžãSObjectizerã®ã¡ãã»ãŒãžã¯ãå€æŽãã¹ãã§ã¯ãªãäžå€ãªããžã§ã¯ããšããŠéä¿¡ãããŸãã ããã¯ãSObjectizerãPub / Subã¢ãã«ãå®è£ ããäžè¬çãªå Žåã«mboxã«ã¡ãã»ãŒãžãéä¿¡ãããããã¡ãã»ãŒãžãåä¿¡ãããµãã¹ã¯ã©ã€ããŒã®æ£ç¢ºãªæ°ãæ£ç¢ºã«èšãããšã¯äžå¯èœã ããã§ãã ãã¶ã10åã«ãªãã§ãããã ãã¶ãçŸã ãã¶ãåã ãããã£ãŠãäžéšã®ãµãã¹ã¯ã©ã€ããŒã¯ã¡ãã»ãŒãžãåæã«åŠçããŸãã ãããã£ãŠããããµãã¹ã¯ã©ã€ããŒãã¡ãã»ãŒãžã®ã€ã³ã¹ã¿ã³ã¹ãå€æŽããããšãèš±å¯ããããšã¯ã§ããŸããããå¥ã®ãµãã¹ã¯ã©ã€ããŒã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããããšããŸãã ãã®ãããéåžžã®ã¡ãã»ãŒãžã¯å®æ°ãªã³ã¯ã«ãã£ãŠãã³ãã©ãŒã«æž¡ãããŸãã
ãã ããã¡ãã»ãŒãžãåäžã®åä¿¡è ã«éä¿¡ãããããšãä¿èšŒãããŠããå ŽåããããŸãã ãããŠããã®åä¿¡è ã¯åä¿¡ããã¡ãã»ãŒãžã€ã³ã¹ã¿ã³ã¹ãå€æŽããããšèããŠããŸãã ãã®äŸã§ã¯ãçµæã®perform_io_tããunique_ptrå€ãååŸãããããæ°ããreinit_device_tã€ã³ã¹ã¿ã³ã¹ã«æž¡ãæ¹æ³ã瀺ããŸãã
ãã®ãããªå Žåã å€æŽå¯èœãªã¡ãã»ãŒãžã®ãµããŒããSObjectizer-5.5.19ã«è¿œå ãããŸããã ãããã®ã¡ãã»ãŒãžã«ã¯ç¹å¥ãªããŒã¯ãä»ããŠããŸãã ãŸããå®è¡æã«SObjectizerã¯ãå¯å€ã¡ãã»ãŒãžããã«ããããã¥ãŒãµãŒ/ãã«ãã³ã³ã·ã¥ãŒãmboxã«éä¿¡ããããã©ããã確èªããŸãã ã€ãŸã å¯å€ã¡ãã»ãŒãžã¯ãè€æ°ã®åä¿¡è ã«é ä¿¡ã§ããŸãã ãããã£ãŠãéåžžã®éäžå®ãªã³ã¯ã«ãã£ãŠåä¿¡è ã«éä¿¡ãããã¡ãã»ãŒãžã®å 容ãå€æŽã§ããŸãã
ãã®çè·¡ã¯ãã³ãŒãa_device_manager_tã«ãããŸãã ããšãã°ã次ã®ãã³ãã©ã·ã°ããã£ã¯ããã³ãã©ãå€æŽå¯èœãªã¡ãã»ãŒãžãäºæããŠããããšã瀺ããŠããŸãã
void on_perform_io(mutable_mhood_t<perform_io_t> cmd) const
ãããããã®ã³ãŒãã¯ãå¯å€ã¡ãã»ãŒãžã®ã€ã³ã¹ã¿ã³ã¹ãéä¿¡ãããããšã瀺ããŠããŸãã
so_5::send<so_5::mutable_msg<reinit_device_t>>(*this, std::move(cmd->device_));
adv_thread_poolãã£ã¹ãããã£ãŒã䜿çšããã·ãã¥ã¬ãŒã·ã§ã³
a_device_manager_tãéåžžã®adv_thread_poolãããŒãžã£ãŒã§ã©ã®ããã«åäœãããã確èªããã«ã¯ãa_dashboard_tããã³a_device_manager_tãšãŒãžã§ã³ãã®é£æºãäœæããa_device_manager_tãadv_thread_poolãããŒãžã£ãŒã«ãªã³ã¯ããå¿ èŠããããŸãã ããã¯æ¬¡ã®ããã«ãªããŸã ïŒ
void run_example(const args_t & args ) { print_args(args); so_5::launch([&](so_5::environment_t & env) { env.introduce_coop([&](so_5::coop_t & coop) { const auto dashboard_mbox = coop.make_agent<a_dashboard_t>()->so_direct_mbox(); // // adv_thread_pool-. namespace disp = so_5::disp::adv_thread_pool; coop.make_agent_with_binder<a_device_manager_t>( disp::create_private_disp(env, args.thread_pool_size_)-> binder(disp::bind_params_t{}), args, dashboard_mbox); }); }); }
ããŒã«å ã®20åã®ã¯ãŒã¯ã¹ã¬ãããšä»ã®ããã©ã«ãå€ã䜿çšãããã¹ãå®è¡ã®çµæã次ã®å³ãåŸãããŸãã
äœæ¥ã®éå§çŽåŸã«å€§ããªãç°è²ãã®ããŒã¯ãšåæ§ã«ãæåã«å€§ããªãéãã®ããŒã¯ïŒããã¯èµ·åæã®ããã€ã¹ã®å€§èŠæš¡ãªäœæã§ãïŒãèŠãããšãã§ããŸãã æåã«ãå€æ°ã®init_device_tã¡ãã»ãŒãžãåä¿¡ããŸãããã®ãã¡ã®ããã€ãã¯ãé çªãåŠçããããŸã§é·æéåŸ æ©ããŸãã ãã®åŸãperform_io_tã¯éåžžã«è¿ éã«åŠçãããå€æ°ã®reinit_device_tãçæãããŸãã ãããã®reinit_device_tã®äžéšã¯äžŠãã§åŸ æ©ããŠãããããé¡èãªç°è²ã®ããŒã¯ããããŸãã ãŸããç·è²ã®ç·ã«é¡èãªäœäžãèŠãããŸãã ããã¯ãreinit_device_tãšinit_device_tãäžæ¬åŠçãããŠããæç¹ã§åŠçãããperform_io_tã¡ãã»ãŒãžã®æ°ãæžå°ããããšã§ãã
ç§ãã¡ã®ä»äºã¯ããã°ã¬ãŒãããŒã¹ãã®æ°ãæžããããã°ãªãŒã³ããã£ãããããã»ã©æ·±ãããªãããšã§ãã
ç¬èªã®cãªthread_poolãã£ã¹ãããã£ãŒã®ã¢ã€ãã¢
adv_thread_poolãã£ã¹ãããã£ãŒã®åé¡ã¯ã圌ã«ãšã£ãŠãã¹ãŠã®ãªã¯ãšã¹ããçããããšã§ãã ãããã£ãŠãäœæ¥ã¹ã¬ããã解æŸãããšããã«ããã¥ãŒããæåã®ã¢ããªã±ãŒã·ã§ã³ã圌女ã«æž¡ããŸãã ãããã©ããªçš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ã§ããããå®å šã«ç解ããŠããªãã ããã«ããããã¹ãŠã®äœæ¥ã¹ã¬ãããinit_device_tãŸãã¯reinit_device_tã®ãªã¯ãšã¹ãã®åŠçã§ããžãŒç¶æ ã«ãªããperform_io_tã¿ã€ãã®ãªã¯ãšã¹ãããã¥ãŒã«èç©ãããç¶æ³ã«ãªããŸãã
ãã®åé¡ãåãé€ãããã«ã2ã€ã®ã¿ã€ãã®ã¯ãŒã¯ã¹ã¬ããã®2ã€ã®ãµãããŒã«ãæã€ç¬èªã®å·§åŠãªthread_poolãããŒãžã£ãŒãäœæããŸãã
æåã®ã¿ã€ãã®äœæ¥ã¹ã¬ããã¯ãããããã¿ã€ãã®ã¢ããªã±ãŒã·ã§ã³ãåŠçã§ããŸãã ã¿ã€ãinit_device_tããã³reinit_device_tã®ãªã¯ãšã¹ããåªå ãããŸãããããããçŸåšå©çšã§ããªãå Žåãã¿ã€ãperform_io_tã®ããã©ãŒãã³ã¹ãåŠçã§ããŸãã
2çªç®ã®ã¿ã€ãã®ã¯ãŒã«ãŒã¹ã¬ããã¯ãinit_device_tããã³reinit_device_tã¿ã€ãã®ãªã¯ãšã¹ããåŠçã§ããŸããã ã¿ã€ãperform_io_tã®èŠæ±ã¯åŠçã§ããŸãããã¿ã€ãinit_device_tã®èŠæ±ã¯åŠçã§ããŸããã
ãããã£ãŠãreinit_device_tã¿ã€ãã®50ã®ã¯ã¬ãŒã ãšperform_io_tã¿ã€ãã®150ã®ã¯ã¬ãŒã ãããå Žåãæåã®ãµãããŒã«ã¯reinit_device_tã¯ã¬ãŒã ãã¬ãŒããã2çªç®ã®ãµãããŒã«ã¯åæã«perform_io_tã¯ã¬ãŒã ãã¬ãŒãããŸãã reinit_device_tã¿ã€ãã®ãã¹ãŠã®èŠæ±ãåŠçããããšãæåã®ãµãããŒã«ã®äœæ¥ã¹ã¬ããã解æŸãããperform_io_tã¿ã€ãã®æ®ãã®èŠæ±ã®åŠçãæ¯æŽã§ããããã«ãªããŸãã
å·§åŠãªthread_poolãã£ã¹ãããã£ãŒã¯ãçããªã¯ãšã¹ããåŠçããããã®å¥åã®ã¹ã¬ããã»ãããä¿æããŠãããããå€æ°ã®é·ããªã¯ãšã¹ããããå Žåã§ãïŒããšãã°ãäœæ¥ã®éå§æãäžåºŠã«å€§éã®init_device_tãéä¿¡ããå Žåãªã©ïŒãã·ã§ãŒããªãŒããŒãé ãããããšã¯ã§ããŸããã
unningãªthread_poolãã£ã¹ãããã£ãŒã䜿çšããã·ãã¥ã¬ãŒã·ã§ã³
åãã·ãã¥ã¬ãŒã·ã§ã³ãè¡ãããç°ãªããã£ã¹ãããã£ã䜿çšããã«ã¯ãäžèšã®run_exampleé¢æ°ãåå®è¡ããã ãã§ãã
void run_example(const args_t & args ) { print_args(args); so_5::launch([&](so_5::environment_t & env) { env.introduce_coop([&](so_5::coop_t & coop) { const auto dashboard_mbox = coop.make_agent<a_dashboard_t>()->so_direct_mbox(); // // . coop.make_agent_with_binder<a_device_manager_t>( tricky_dispatcher_t::make(env, args.thread_pool_size_)->binder(), args, dashboard_mbox); }); }); }
ã€ãŸã ãã¹ãŠåããšãŒãžã§ã³ããäœæããŸãããä»åã¯a_device_manager_tãå¥ã®ãã£ã¹ãããã£ã«ãã€ã³ãããŸãã
åããã©ã¡ãŒã¿ã§èµ·åããçµæãå¥ã®ç»åã衚瀺ãããŸãã
ãŸã åããéãããŒã¯ããããŸãã ä»ã§ã¯ããã«é«ããªã£ãŠããŸãããé©ãããšã§ã¯ãããŸããã init_device_tãåŠçããããã«å²ãåœãŠãããäœæ¥ã¹ã¬ãããå°ãªããªããŸããã ãããããç°è²ãã®ããŒã¯ã¯èŠãããããç·ãã®ãã£ããã¯ããã»ã©æ·±ããªããŸããã
ã€ãŸã æãã çµæãåŸãããŸããã ãããŠããã®æãunningãªãã£ã¹ãããã£ã®ã³ãŒããèŠãããšãã§ããŸãã
ããªãããŒãªthread_poolãã£ã¹ãããã£ãŒã®å®è£
SObjectizerã®ãã£ã¹ãããã£ã¯2ã€ã®ã¿ã€ãã«åããããŸãã
ãŸããå ¬å ±ãã£ã¹ãããã£ã åãããªãã¯ãã£ã¹ãããã£ã«ã¯äžæã®ååãå¿ èŠã§ãã éåžžããã£ã¹ãããã£ã€ã³ã¹ã¿ã³ã¹ã¯ãSObjectizerã®éå§åãSObjectizerã®éå§æããããªãã¯ãã£ã¹ãããã£ã®éå§æãããã³SObjectizerã®çµäºæã«åæ¢ããŸãã ãããã®ã³ã³ãããŒã©ãŒã«ã¯ã ç¹å®ã®ã€ã³ã¿ãŒãã§ãŒã¹ãå¿ èŠã§ãã ããããããã¯æ代é ãã®ã¿ã€ãã®ãã£ã¹ãããã£ã§ãã SObjectizerã®æ¬¡ã®ã¡ãžã£ãŒããŒãžã§ã³ã§ã¯ããããªãã¯ãã£ã¹ãããã£ããªããªãå¯èœæ§ã¯ã»ãšãã©ãããŸããã
第äºã«ããã©ã€ããŒããã£ã¹ãããã£ãŒã ãŠãŒã¶ãŒã¯ãSObjectizerã®èµ·ååŸãã€ã§ããã®ãããªãã£ã¹ãããã£ãäœæããŸãã ãã©ã€ããŒããã£ã¹ãããã£ãŒã¯ãäœæåŸããã«èµ·åããå¿ èŠãããã䜿çšãããªããªã£ãåŸã¯äœæ¥ãçµäºããŸãã ã·ãã¥ã¬ãŒã·ã§ã³ã®ããã«ããã©ã€ããŒããã£ã¹ãããã£ãšããŠã®ã¿äœ¿çšã§ãããã£ã¹ãããã£ãäœæããŸãã
ãã£ã¹ãããã£ã«é¢é£ããäž»èŠãªãã€ã³ããèŠãŠã¿ãŸãããã
ãã£ã¹ãããã£ã®disp_binder
ãã©ã€ããŒããã£ã¹ãããã£ã«ã¯ãå³å¯ã«å®çŸ©ãããã€ã³ã¿ãŒãã§ã€ã¹ã¯ãããŸããã ãã¹ãŠã®åºæ¬çãªæäœã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãšãã¹ãã©ã¯ã¿ãŒã§å®è¡ãããŸãã ãã ãããã©ã€ããŒããã£ã¹ãããã£ãŒã«ã¯ãéåžžãã€ã³ããŒïŒïŒãšåŒã°ããç¹å¥ãªãã€ã³ããŒãªããžã§ã¯ããè¿ããããªãã¯ã¡ãœãããå¿ èŠã§ãã ãã®ãã€ã³ããŒãªããžã§ã¯ãã¯ããšãŒãžã§ã³ããç¹å®ã®ãã£ã¹ãããã£ãŒã«ãã€ã³ãããŸãã ãããŠããã€ã³ããŒã«ã¯ãã§ã«æ確ãªã€ã³ã¿ãŒãã§ãŒã¹disp_binder_tãããã¯ãã§ãã
ãããã£ãŠã ãã£ã¹ãããã£ã§ã¯ãdisp_binder_tã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããç¬èªã®ãã€ã³ããŒã¿ã€ããäœæããŸãã
class tricky_dispatcher_t : public std::enable_shared_from_this<tricky_dispatcher_t> { friend class tricky_event_queue_t; friend class tricky_disp_binder_t; class tricky_event_queue_t : public so_5::event_queue_t {...}; class tricky_disp_binder_t : public so_5::disp_binder_t { std::shared_ptr<tricky_dispatcher_t> disp_; public: tricky_disp_binder_t(std::shared_ptr<tricky_dispatcher_t> disp) : disp_{std::move(disp)} {} virtual so_5::disp_binding_activator_t bind_agent( so_5::environment_t &, so_5::agent_ref_t agent) override { return [d = disp_, agent] { agent->so_bind_to_dispatcher(d->event_queue_); }; } virtual void unbind_agent( so_5::environment_t &, so_5::agent_ref_t) override { // . } }; ... // , so_5::event_queue_t , // . tricky_event_queue_t event_queue_; ... public: ... // , . so_5::disp_binder_unique_ptr_t binder() { return so_5::disp_binder_unique_ptr_t{ new tricky_disp_binder_t{shared_from_this()}}; } };
tricky_dispatcher_tã¯ã©ã¹ã¯std :: enable_shared_from_thisãç¶æ¿ãããããåç §ã«ãŠã³ã¿ãŒã䜿çšããŠãã£ã¹ãããã£ãŒã®æå¹æéãå¶åŸ¡ã§ããŸãã ãã£ã¹ãããã£ãŒã®äœ¿çšãåæ¢ããããšããã«ãåç §ã«ãŠã³ã¿ãŒããªã»ããããããã£ã¹ãããã£ãŒã¯èªåçã«ç Žæ£ãããŸãã
ticky_dispatcher_tã¯ã©ã¹ã«ã¯ãtricky_disp_binder_tã®æ°ããã€ã³ã¹ã¿ã³ã¹ãè¿ããããªãã¯ãã€ã³ããŒïŒïŒã¡ãœããããããŸãã ãã£ã¹ãããã£ãŒèªäœãžã®ã¹ããŒããã€ã³ã¿ãŒããã®ã€ã³ã¹ã¿ã³ã¹ã«æž¡ãããŸãã ããã«ãããrun_exampleã³ãŒãã§åè¿°ããããã«ãç¹å®ã®ãšãŒãžã§ã³ããç¹å®ã®ãã£ã¹ãããã£ã«é¢é£ä»ããããšãã§ããŸãã
// // . coop.make_agent_with_binder<a_device_manager_t>( tricky_dispatcher_t::make(env, args.thread_pool_size_)->binder(), args, dashboard_mbox); }); });
ãã€ã³ããªããžã§ã¯ãã¯2ã€ã®ããšãè¡ãå¿ èŠããããŸãã 1ã€ç®ã¯ããšãŒãžã§ã³ãããã£ã¹ãããã£ãŒã«ãã€ã³ãããããšã§ãã bind_agentïŒïŒã¡ãœããã§è¡ãããŠããããšã å®éããšãŒãžã§ã³ãã®ãã£ã¹ãããã£ãžã®ãã€ã³ãã¯2段éã§å®è¡ãããŸãã ãŸããååãç»é²ããããã»ã¹ã§bind_agentïŒïŒã¡ãœãããåŒã³åºããããã®ã¡ãœããã¯ãšãŒãžã§ã³ãã«å¿ èŠãªãã¹ãŠã®ãªãœãŒã¹ãäœæããå¿ èŠããããŸãã ããšãã°ããšãŒãžã§ã³ããactive_objãã£ã¹ãããã£ãŒã«ãã€ã³ããããŠããå Žåãæ°ããäœæ¥ã¹ã¬ããããšãŒãžã§ã³ãã«å²ãåœãŠãå¿ èŠããããŸãã ããã¯ãŸãã«bind_agentïŒïŒã§èµ·ããã¹ãããšã§ãã bind_agentïŒïŒã¡ãœããã¯ã以åã«å²ãåœãŠããããªãœãŒã¹ã䜿çšããŠãšãŒãžã§ã³ããã€ã³ãã£ã³ã°æé ãæ¢ã«å®äºãããã¡ã³ã¯ã¿ãè¿ããŸãã ã€ãŸã ååãç»é²ãããšããŸãbind_agentïŒïŒãåŒã³åºãããå°ãåŸã«bind_agentïŒïŒã«ãã£ãŠè¿ããããã¡ã³ã¯ã¿ãŒãåŒã³åºãããŸãã
ãã®å Žåãbind_agentïŒïŒã¯éåžžã«åçŽã§ãã ãªãœãŒã¹ãå²ãåœãŠãå¿ èŠã¯ãããŸããããã¡ã³ã¯ã¿ãè¿ãã ãã§ããšãŒãžã§ã³ããšãã£ã¹ãããã£ãæ¥ç¶ãããŸãïŒããã«ã€ããŠã¯ä»¥äžã§è©³ãã説æããŸãïŒã
2çªç®ã®ã¢ã¯ã·ã§ã³ã¯ããšãŒãžã§ã³ãããã£ã¹ãããã£ãŒããåãé¢ãããšã§ãã ãã®è§£æŸã¯ããšãŒãžã§ã³ããSObjectizerããåé€ïŒç»é²è§£é€ïŒããããšãã«çºçããŸãã ãã®å ŽåããšãŒãžã§ã³ãã«å²ãåœãŠãããŠããäžéšã®ãªãœãŒã¹ãã¯ãªã¢ããå¿ èŠãããå ŽåããããŸãã ããšãã°ããã£ã¹ãããã£active_objã¯ããšãŒãžã§ã³ãã«å²ãåœãŠãããäœæ¥ã¹ã¬ãããåæ¢ããŸãã
unbind_agentïŒïŒã¡ãœããã¯ã2çªç®ã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã ãããããã®äŸã§ã¯ãtricky_dispatcher_tã§ã¯ãšãŒãžã§ã³ãã解æŸãããšãã«ãªãœãŒã¹ãã¯ãªãŒãã³ã°ããå¿ èŠããªãããã空ã§ãã
tricky_event_queue_t
äžèšã§ããšãŒãžã§ã³ãããã£ã¹ãããã£ã«ãã€ã³ããããããšã«ã€ããŠèª¬æããŸãããããã®ãã€ã³ãã®ãã€ã³ãã¯äœã§ããïŒ ãã€ã³ãã¯2ã€ã®ç°¡åãªããšã§ãã
ãŸããåè¿°ã®active_objã®ãããªäžéšã®ãã£ã¹ãããã£ã¯ããã€ã³ãæã«ç¹å®ã®ãªãœãŒã¹ããšãŒãžã§ã³ãã«å²ãåœãŠãå¿ èŠããããŸãã
第äºã«ãSObjectizerãšãŒãžã§ã³ãã«ã¯ãç¬èªã®ã¡ãã»ãŒãž/ãªã¯ãšã¹ããã¥ãŒããããŸããã ããããSObjectizerãšãã¯ã©ã·ãã¯ã¢ã¯ã¿ãŒã¢ãã«ãã®å®è£ ãšã®åºæ¬çãªéãã§ããåã¢ã¯ã¿ãŒã¯ç¬èªã®ã¡ãŒã«ããã¯ã¹ïŒãããã£ãŠãç¬èªã®ã¡ãã»ãŒãžãã¥ãŒïŒãæã¡ãŸãã
SObjectizerã§ã¯ããã£ã¹ãããã£ãã¢ããªã±ãŒã·ã§ã³ã®ãã¥ãŒãææããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ä¿åå Žæãšæ¹æ³ïŒãšãŒãžã§ã³ãã«å®ãŠãããã¡ãã»ãŒãžïŒãã¢ããªã±ãŒã·ã§ã³ã®ååŸãšåŠçã®å Žæãæéãæ¹æ³ã決å®ããã®ã¯ãã£ã¹ãããã£ã§ãã
ãããã£ãŠããšãŒãžã§ã³ããSObjectizerå ã§åäœãéå§ãããšããšãŒãžã§ã³ããšæ³šæãã¥ãŒã®éã«æ¥ç¶ã確ç«ããå¿ èŠããããŸãããã®æ¥ç¶ã«ã¯ããšãŒãžã§ã³ãå®ã®ã¡ãã»ãŒãžãè¿œå ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ããšãŒãžã§ã³ãã§ç¹å¥ãªã¡ãœããso_bind_to_dispatcherïŒïŒãåŒã³åºãããã®ã¡ãœããã«event_queue_tã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ãããªããžã§ã¯ããžã®åç §ãæž¡ãå¿ èŠããããŸãã å®éãããã¯tricky_disp_binder_t :: bind_agentïŒïŒã®å®è£ ã«èŠãããŸãã
ããããåé¡ã¯ãtricky_disp_binder_tãso_bind_to_dispatcherïŒïŒã«æ£ç¢ºã«äžãããã®ã§ãã ç§ãã¡ã®å Žåãããã¯event_queue_tã€ã³ã¿ãŒãã§ãŒã¹ã®ç¹å¥ãªå®è£ ã§ãããããã¯tricky_dispatcher_t :: push_demandïŒïŒãåŒã³åºãããã®åãªãã·ã³ãããã·ãšããŠæ©èœããŸãã
class tricky_event_queue_t : public so_5::event_queue_t { tricky_dispatcher_t & disp_; public: tricky_event_queue_t(tricky_dispatcher_t & disp) : disp_{disp} {} virtual void push(so_5::execution_demand_t demand) override { disp_.push_demand(std::move(demand)); } };
tricky_dispatcher_t :: push_demandã¯äœãé ããŸããïŒ
ãã®ãããtricky_dispatcher_tã«ã¯ãtricky_event_queue_tã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãããããã£ã¹ãããã£ã«ãã€ã³ããããŠãããã¹ãŠã®ãšãŒãžã§ã³ãã«ãªã³ã¯ãæž¡ãããŸãã ãããŠããã®ã€ã³ã¹ã¿ã³ã¹èªäœã¯ããã¹ãŠã®äœæ¥ãtricky_dispatcher_t :: push_demandïŒïŒã¡ãœããã«åçŽã«å§ä»»ããŸãã push_demandã®å éšãèŠãæéã§ãïŒ
void push_demand(so_5::execution_demand_t demand) { if(init_device_type == demand.m_msg_type || reinit_device_type == demand.m_msg_type) { // . so_5::send<so_5::execution_demand_t>(init_reinit_ch_, std::move(demand)); } else { // , . so_5::send<so_5::execution_demand_t>(other_demands_ch_, std::move(demand)); } }
ããã§ã¯ãã¹ãŠãç°¡åã§ãã æ°ããã¢ããªã±ãŒã·ã§ã³ããšã«ããã®ã¿ã€ãããã§ãã¯ãããŸãã èŠæ±ãinit_device_tãŸãã¯reinit_device_tã¡ãã»ãŒãžã«é¢é£ããå Žåã1ã€ã®å Žæã«é 眮ãããŸãã ãããä»ã®ã¿ã€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ããå Žåãå¥ã®å Žæã«é 眮ãããŸãã
æãèå³æ·±ãã®ã¯ãinit_reinit_ch_ããã³other_demands_ch_ãšã¯äœã§ããïŒ ãããŠããããã¯SObjectizerã§mchainsãšåŒã°ããCSPãã£ãã«ã«ãããŸããã
// , . so_5::mchain_t init_reinit_ch_; so_5::mchain_t other_demands_ch_;
ãšãŒãžã§ã³ãã«å¯ŸããŠæ°ããã¢ããªã±ãŒã·ã§ã³ãçæããããã®ã¢ããªã±ãŒã·ã§ã³ãpush_demandã«éãããšããã®ã¿ã€ããåæãããã¢ããªã±ãŒã·ã§ã³ã1ã€ã®ãã£ãã«ãŸãã¯å¥ã®ãã£ãã«ã«éä¿¡ãããããšãããããŸããã ãããŠããã£ã¹ãããã£ããŒã«ã®äžéšã§ãããã§ã«åäœããŠããã¹ã¬ããã¯ããã§ã«ã¢ããªã±ãŒã·ã§ã³ãæœåºããã³åŠçããŠããŸãã
ãã£ã¹ãããã£ãŒã¹ã¬ããã®å®è£
åè¿°ã®ããã«ãããªãããŒãªãã£ã¹ãããã£ã¯2çš®é¡ã®ã¯ãŒã¯ã¹ã¬ããã䜿çšããŸããããã§ãæåã®ã¿ã€ãã®äœæ¥ã¹ã¬ãããinit_reinit_ch_ããã¢ããªã±ãŒã·ã§ã³ãèªã¿åããå®è¡ããå¿ èŠãããããšã¯ãã§ã«æããã§ãããŸããinit_reinit_ch_ã空ã®å Žåãother_demands_ch_ããã¢ããªã±ãŒã·ã§ã³ãèªã¿åã£ãŠå®è¡ããå¿ èŠããããŸããäž¡æ¹ã®ãã£ãã«ã空ã®å Žåãäžæ¹ã®ãã£ãã«ãã¢ããªã±ãŒã·ã§ã³ãåä¿¡ãããŸã§ã¹ãªãŒãããå¿ èŠããããŸãããŸãã¯ãäž¡æ¹ã®ãã£ãã«ãéãããããŸã§ã
2çªç®ã®ã¿ã€ãã®äœæ¥ã¹ã¬ããã䜿çšãããšãããã«ç°¡åã«ãªããŸããother_demands_ch_ããã®ã¿ã¢ããªã±ãŒã·ã§ã³ãèªã¿åãå¿ èŠããããŸãã
å®éãããã¯ãtricky_dispatcher_tã³ãŒãã§èŠããããšããã§ãã
// so_5::execution_demand_t. static void exec_demand_handler(so_5::execution_demand_t d) { d.call_handler(so_5::null_current_thread_id()); } // . void first_type_thread_body() { // , . so_5::select(so_5::from_all(), case_(init_reinit_ch_, exec_demand_handler), case_(other_demands_ch_, exec_demand_handler)); } // . void second_type_thread_body() { // , . so_5::select(so_5::from_all(), case_(other_demands_ch_, exec_demand_handler)); }
ã€ãŸãæåã®ã¿ã€ãã®ã¹ã¬ããã¯ã2ã€ã®ãã£ãã«ã®éžæã§ãã³ã°ããŸãã2çªç®ã®ã¿ã€ãã®ã¹ã¬ããã¯1ã€ã®ãã£ãã«ããã®ã¿éžæãããŸãïŒååãšããŠãsecond_type_thread_bodyïŒïŒå ã§ã¯ãso_5 :: selectïŒïŒã®ä»£ããã«so_5 :: receiveïŒïŒã䜿çšã§ããŸãïŒã
å®éã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®2ã€ã®ã¹ã¬ããã»ãŒããã¥ãŒãæŽçãããããã®ãã¥ãŒãç°ãªãã¯ãŒã¯ã¹ã¬ããã§èªã¿åãããã«å¿ èŠãªããšã¯ããã ãã§ãã
ããªãããŒãªãã£ã¹ãããã£ã®éå§ãšåæ¢
å®å šãæãããã«ãtricky_dispatcher_tã®éå§ãšåæ¢ã«é¢é£ããã³ãŒããèšäºã«å«ããããšã¯çã«ããªã£ãŠããŸããã³ã³ã¹ãã©ã¯ã¿ãŒã§éå§ãå®è¡ããããã¹ãã©ã¯ã¿ã§åæ¢ãããããå®è¡ãããŸãã
// . tricky_dispatcher_t( // SObjectizer Environment, . so_5::environment_t & env, // , . unsigned pool_size) : event_queue_{*this} , init_reinit_ch_{so_5::create_mchain(env)} , other_demands_ch_{so_5::create_mchain(env)} { const auto [first_type_count, second_type_count] = calculate_pools_sizes(pool_size); launch_work_threads(first_type_count, second_type_count); } ~tricky_dispatcher_t() noexcept { // . shutdown_work_threads(); }
ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ãinit_reinit_ch_ããã³other_demands_ch_ãã£ã³ãã«ã®äœæã確èªã§ããŸãã
ãã«ããŒã¡ãœããlaunch_work_threadsïŒïŒããã³shutdown_work_threadsïŒïŒã¯æ¬¡ã®ããã«ãªããŸãã
// . // , // . void launch_work_threads( unsigned first_type_threads_count, unsigned second_type_threads_count) { work_threads_.reserve(first_type_threads_count + second_type_threads_count); try { for(auto i = 0u; i < first_type_threads_count; ++i) work_threads_.emplace_back([this]{ first_type_thread_body(); }); for(auto i = 0u; i < second_type_threads_count; ++i) work_threads_.emplace_back([this]{ second_type_thread_body(); }); } catch(...) { shutdown_work_threads(); throw; // . } } // , . void shutdown_work_threads() noexcept { // . so_5::close_drop_content(init_reinit_ch_); so_5::close_drop_content(other_demands_ch_); // , // . for(auto & t : work_threads_) t.join(); // . work_threads_.clear(); }
ããã§ãããããå¯äžã®æ³šæç¹ã¯ãlaunch_work_threadsã§äŸå€ããã£ããããshutdown_work_threadsãåŒã³åºããŠãããããã«äŸå€ãã¹ããŒããå¿ èŠãããããšã§ããä»ã®ãã¹ãŠã¯ããããªããšã®ããã§ãå°é£ãåŒãèµ·ããã¹ãã§ã¯ãããŸããã
ãããã«
äžè¬çã«ãSObjectizerã®ãã£ã¹ãããã£ã®éçºã¯ç°¡åãªãããã¯ã§ã¯ãããŸããããŸããSO-5.5ããã³so_5_extraã«å«ãŸããæšæºãã£ã¹ãããã£ã¯ããã®èšäºã§ç€ºããtricky_dispatcher_tãããã¯ããã«é«åºŠãªå®è£ ãåããŠããŸããããã«ãããããããç¹å®ã®ç¶æ³ã§ã¯ãåäžã®ãã«ã¿ã€ã ãã£ã¹ãããã£ã100ïŒ é©åã§ãªãå Žåãã¿ã¹ã¯ã«åãããŠç¹å¥ã«èª¿æŽãããç¬èªã®ãã£ã¹ãããã£ãå®è£ ã§ããŸããå®è¡æã®ç£èŠãçµ±èšãªã©ã®è€éãªãããã¯ã«è§Šããããšããªãå Žåãç¬èªã®ãã£ã¹ãããã£ãæžãããšã¯ãã®ãããªæ¥µç«¯ã«çŠæ¢çãªãããã¯ã«ã¯èŠããŸããã
ãŸããäžèšã®tricky_dispatcher_tã¯ããã€ã³ããããŠãããã¹ãŠã®ãšãŒãžã§ã³ãã®ã€ãã³ããã¹ã¬ããã»ãŒãã§ãããåæã«äœãèããã«åŒã³åºãããšãã§ãããšããéåžžã«éèŠãªä»®å®ã®ããã«åçŽã§ããããšãå€æããããšã«æ³šæããå¿ èŠããããŸãããã ããããã¯éåžžããã§ã¯ãããŸãããã»ãšãã©ã®å ŽåããšãŒãžã§ã³ãã«ã¯ã¹ã¬ããã»ãŒãã§ãªããã³ãã©ãŒãããããŸããããã ããã¹ã¬ããã»ãŒããã³ãã©ã«ééããå Žåã§ããã¹ã¬ããã»ãŒããã³ãã©ãšåæã«ååšããŸãããŸããã¢ããªã±ãŒã·ã§ã³ããã£ã¹ããããããšãã¯ã次ã®ãã³ãã©ãŒã®ã¿ã€ãã確èªããå¿ èŠããããŸããããšãã°ã次ã®ã¹ã¬ããã»ãŒãã¢ããªã±ãŒã·ã§ã³ã®ãã³ãã©ãåäœããã¹ã¬ããã»ãŒããçŸåšåäœããŠããå Žåã以åã«èµ·åããã¹ã¬ããã»ãŒããã³ãã©ãçµäºãããŸã§åŸ ã€å¿ èŠããããŸããéåžžã®adv_thread_poolãã£ã¹ãããã£ãŒã ãããããåŠçããŸããããããå®éã«ã¯ã»ãšãã©äœ¿çšãããŸãããå€ãã®å Žåãä»ã®ãã£ã¹ãããã£ã䜿çšããããã³ãã©ãŒã®ã¹ã¬ããã»ãŒããã©ã°ãåæããŸãããããã¹ãŠã®ãã³ãã©ãŒãã¹ã¬ããã»ãŒãã§ãªããšèŠãªããŸãã
çµè«ãšããŠã2017幎ã®C ++ãã·ã¢ã§ã®SObjectizerã«ã€ããŠã®å ±åã®åŸããµã€ãã©ã€ã³ã§è©±ããåŸããã®èšäºã§èšåãããå¯å€ã¡ãã»ãŒãžãæäœããæ©èœãSObjectizerã«è¿œå ããããšèšããããšæããŸãã誰ããã©ã€ãã§SObjectizeréçºè ãšãã£ããããããªããããã«ã€ããŠèããŠããããšããã¹ãŠäŒãããå Žåãããã¯C ++ Russia 2018ã§è¡ãããšãã§ããŸãã