ãªãmboxãç¹å¥ãªã®ã§ããïŒ
ãªããªãããã®ã¡ã«ããºã ãSObjectizerã®åŠç¿ãåŒãåãã人ã«å¯ŸããŠéåžžã«ãã䌌ã質åãããã€æèµ·ããã®ããç§ãã¡èªèº«ãé©ããŠããããã§ãã SObjectizerã®éçºè ã§ããç§ãã¡ã«ããç¥ãããç解ã§ãã銎æã¿ã®ãããã®ã¯ãåå¿è ã«ãšã£ãŠæ±ºããŠããã§ã¯ãªãããšãå€æããŸããã ããã ãšããã°ãmboxãäœã§ãããã©ã®ããã«æ©èœããããç解ããŠã¿ãŸãããã ãããŠåæã«ãç¬èªã®mboxãäœæããŠã¿ãŠãã ããã
ãªãmboxãå¿ èŠãªã®ã§ããïŒ
ãšãŒãžã§ã³ãéã®çžäºäœçšãæŽçããã«ã¯ãSObjectizerã®ã¡ãŒã«ããã¯ã¹ãå¿ èŠã§ãã ãšãŒãžã§ã³ãéã®éä¿¡ã¯éåæã¡ãã»ãŒãžã«ãã£ãŠæ§ç¯ããããããã®åãã¡ãã»ãŒãžãã©ããã«éä¿¡ããå¿ èŠããããŸãã ãã©ãã«æ£ç¢ºã«ïŒããšããçåãçããŸãã
åŸæ¥ã®ã¢ã¯ã¿ãŒã¢ãã«ã§ã¯ãã¡ãã»ãŒãžã®åä¿¡è ã¯åä¿¡è ã¢ã¯ã¿ãŒã§ãã ããªãã¡ ã¢ã¯ã¿ãŒAãã¢ã¯ã¿ãŒBã«ã¡ãã»ãŒãžãéä¿¡ããã«ã¯ãã¢ã¯ã¿ãŒAãã¢ã¯ã¿ãŒBãžã®ãªã³ã¯ãæã£ãŠããå¿ èŠããããŸããåä¿¡è ã¢ã¯ã¿ãŒãžã®åç §ã¯ãããŸãã-ã¡ãã»ãŒãžãéä¿¡ããæ¹æ³ã¯ãããŸããã 1ïŒNã¡ãŒãªã³ã°ãå®è¡ããå¿ èŠãããå Žåãéä¿¡è ã«ã¯ãã¹ãŠã®åä¿¡è ãžã®ãªã³ã¯ãå¿ èŠã§ãã ããã¯ãå€å žçãªä¿³åªã®ã¢ãã«ã«ã€ããŠè©±ãå Žåã§ãã
ããããæã ã¯ç°ãªãç¹ç°æ§ãæã£ãŠããŸããïŒéåžžãããŒãã¯æèã決å®ãã解決ããªããã°ãªããªãã¿ã¹ã¯ãšèªç±ã«äœ¿ããããŒã«ã®ããŒãºã«å°ãããŸããïŒã
ãŸããC ++ããããŸãã ãšãŒãžã§ã³ãBãžã®ãªã³ã¯ããšãŒãžã§ã³ãAã«æž¡ããªããšããã ãã§ãã ãããéåžžã®ãªã³ã¯ïŒãŸãã¯éåžžã®ãã¢ãã€ã³ã¿ãŒïŒã§ããå ŽåããšãŒãžã§ã³ãBãç Žæ£ããããšããšãŒãžã§ã³ãAã¯Bãžã®ããã³ã°ãªã³ã°ããªã³ã¯ãæã¡ãŸãããããã£ãŠãéåžžã®ãªã³ã¯/ãã€ã³ã¿ãŒã®ä»£ããã«ãã¹ããŒããªã³ã¯/ãã€ã³ã¿ãŒã䜿çšããå¿ èŠããããŸãã ããããåçŽãªã¹ããŒããã€ã³ã¿ãŒã¯è¯ããããŸããã ãšãŒãžã§ã³ãAã¯ãšãŒãžã§ã³ãBãžã®ã¹ããŒããã€ã³ã¿ãŒãæã£ãŠããéãããšãŒãžã§ã³ãBã¯åé€ãããŸããïŒã€ãŸããææããŠãããªãœãŒã¹ã¯è§£æŸãããŸããïŒã
ãããã£ãŠãC ++ã§ã¯ãã¹ããŒããã€ã³ã¿ãŒã ãã§ãªããããã€ãã®ç¹å¥ãªã¹ããŒããããã·ãªã³ã¯ã䜿çšããå¿ èŠããããŸãã ãšãŒãžã§ã³ãAã¯Bãžã®ãããã·ãªã³ã¯ãæã£ãŠããå ŽåããããŸãããAããŸã ãããã·ãªã³ã¯ãæã£ãŠããå Žåã§ããBãå®å šã«åé€ã§ããŸãã ããã«ãAã¯ååšããªããšãŒãžã§ã³ãBã«ã¡ãã»ãŒãžãéä¿¡ããããšããå Žåãããããã®è©Šã¿ã¯å£æ» çãªçµæïŒä»ã®èª°ãã®ã¡ã¢ãªãç ŽæããããC ++ã§ã¶ãäžãã£ãŠãããªã³ã¯ã«ã¢ã¯ã»ã¹ãããšãã®ããã«ã¢ããªã±ãŒã·ã§ã³å šäœãã¯ã©ãã·ã¥ãããªã©ïŒã«ã€ãªããããšã¯ãããŸããã
次ã«ã1察Nã®çžäºäœçšãéåžžã«äžè¬çã§ããã ããã«ãæåã¯äžè¬çã«ãšãŒãžã§ã³ããçžäºäœçšããå¯äžã®æ¹æ³ã§ããã ãããã£ãŠããšãŒãžã§ã³ãAããæ å ±ãåä¿¡ããå¿ èŠããããšãŒãžã§ã³ãBããã³Cããæåã«èªåèªèº«ãžã®ãªã³ã¯ããšãŒãžã§ã³ãAã«éä¿¡ããããšã匷å¶ãããããããŸããã§ããããããŠããã®ãšãŒãžã§ã³ãAã¯ãã¢ãŒãã§Aããã®ã¡ãã»ãŒãžãåä¿¡ããããšãŒãžã§ã³ãã®ãªã¹ããåå¥ã«ç¶æããå¿ èŠããããŸãã1ïŒN
ãã®çµæããã¡ãŒã«ããã¯ã¹ãã®æŠå¿µããããŸãããããã¯ãaïŒãšãŒãžã§ã³ããäºãã«éä¿¡ããããã«äœ¿çšã§ããéåžžã«ã¹ããŒããªãããã·ãªã³ã¯ã§ãããbïŒã¢ãŒã1ã§ã®çžäºäœçšãç°¡çŽ åããã¡ã«ããºã ã§ããããã ãã«äœæãããŸããïŒN
mbox-sãååšããå ŽåããšãŒãžã§ã³ãã¯ã¡ãã»ãŒãžãäºãã«çŽæ¥éä¿¡ããã®ã§ã¯ãªããã¡ãŒã«ããã¯ã¹ïŒmbox-sïŒã§éä¿¡ããŸãã mboxã«éä¿¡ãããã¡ãã»ãŒãžã¯ããã®mboxããã®ã¡ãã»ãŒãžã賌èªããŠãããšãŒãžã§ã³ãã«é ä¿¡ãããŸãã
ãããã£ãŠããšãŒãžã§ã³ãAããšãŒãžã§ã³ãBã«ã¡ãã»ãŒãžãéä¿¡ããã«ã¯ãäž¡æ¹ã®ãšãŒãžã§ã³ããèªèããŠããmboxãå¿ èŠã§ãã ãšãŒãžã§ã³ãAã¯ãã®mboxã«ã¡ãã»ãŒãžãéä¿¡ãããšãŒãžã§ã³ãBã¯ãã®mboxããã®ã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ãããŸãã ãã®å°ããªäŸã§ãããããã«ïŒ
#include <so_5/all.hpp> class A final : public so_5::agent_t { const so_5::mbox_t to_; public: A(context_t ctx, so_5::mbox_t to) : so_5::agent_t{std::move(ctx)}, to_{std::move(to)} {} virtual void so_evt_start() override { // B. so_5::send<std::string>(to_, "Hello!"); } }; class B final : public so_5::agent_t { public: B(context_t ctx, const so_5::mbox_t & from) : so_5::agent_t{std::move(ctx)} { // from. so_subscribe(from).event(&B::on_string); } private: void on_string(mhood_t<std::string> cmd) { std::cout << "Message: " << *cmd << std::endl; // . so_deregister_agent_coop_normally(); } }; int main() { so_5::launch([](so_5::environment_t & env) { // , // mbox . env.introduce_coop([&](so_5::coop_t & coop) { // mbox, // A B. const auto mbox = env.create_mbox(); // , // mbox . coop.make_agent<A>(mbox); coop.make_agent<B>(mbox); }); }); return 0; }
ããã«ã1ïŒNã¢ãŒãã§ã¡ãã»ãŒãžãéä¿¡ãåä¿¡ããããšã¯ã1ïŒ1ã¢ãŒãã§ã¡ãã»ãŒãžãéä¿¡/åä¿¡ããããšãšå€ãããŸããã äžèšã®äŸã¯ããšãŒãžã§ã³ãAããšãŒãžã§ã³ãBãšCã«åæã«ã¡ãã»ãŒãžãéä¿¡ããå Žåãã©ã®ããã«æ¢ããã瀺ããŠããŸãã
#include <so_5/all.hpp> class A final : public so_5::agent_t { const so_5::mbox_t to_; public: A(context_t ctx, so_5::mbox_t to) : so_5::agent_t{std::move(ctx)}, to_{std::move(to)} {} virtual void so_evt_start() override { // B. so_5::send<std::string>(to_, "Hello!"); } }; class B final : public so_5::agent_t { public: B(context_t ctx, const so_5::mbox_t & from) : so_5::agent_t{std::move(ctx)} { // from. so_subscribe(from).event(&B::on_string); } private: void on_string(mhood_t<std::string> cmd) { std::cout << "(B) Message: " << *cmd << std::endl; // . so_deregister_agent_coop_normally(); } }; class C final : public so_5::agent_t { public: C(context_t ctx, const so_5::mbox_t & from) : so_5::agent_t{std::move(ctx)} { // from. so_subscribe(from).event([](mhood_t<std::string> cmd) { // , , // B. std::cout << "(C) Message: " << *cmd << std::endl; }); } }; int main() { so_5::launch([](so_5::environment_t & env) { // , // mbox . env.introduce_coop([&](so_5::coop_t & coop) { // mbox, // A, B, C. const auto mbox = env.create_mbox(); // , // mbox . coop.make_agent<A>(mbox); coop.make_agent<B>(mbox); coop.make_agent<C>(mbox); }); }); return 0; }
mboxã¯ã©ã®ããã«æ©èœããŸããïŒ
ç°ãªãmbox-sã®åäœã¯ç°ãªããŸã:)ãããã£ãŠãæãåºã䜿çšãããŠããmbox-sã®ã¿ã€ããã©ã®ããã«æ©èœããããç¥ãã«ã¯ãæåã«mbox-sã®äžè¬çãªå 容ã«ã€ããŠè©±ãå¿ èŠããããŸãã
mboxãšã¯äœã§ããïŒ
ãã«ããããã¥ãŒãµãŒ/ãã«ãã³ã³ã·ã¥ãŒããŒ
æŽå²çã«ãããã¯SObjectizer-5ã«ç»å Žããæåã®ã¿ã€ãã®mboxã§ãã 誰ã§ããã®ãããªmboxã«ã¡ãã»ãŒãžãéä¿¡ã§ããŸãã 誰ã§ããã®mboxããã®ã¡ãã»ãŒãžã賌èªã§ããŸãã
ãã«ããããã¥ãŒãµãŒ/ã·ã³ã°ã«ã³ã³ã·ã¥ãŒããŒ
1ïŒ1ã®å¯Ÿè©±ã§ã¯ãMPSC-mboxã䜿çšã§ããŸããMPSC-mboxã§ã¯èª°ã§ãã¡ãã»ãŒãžãéä¿¡ã§ããŸãããMPSC-mboxãææãã1人ã®ãšãŒãžã§ã³ãã¯MPSC-mboxããã®ã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ãã§ããŸãã
MPSC mboxã¯ãSObjectizer-5ã®ã¢ã¯ãã£ããªäœ¿çšã®éå§åŸãã°ããããŠSObjectizer-5ã«ç»å ŽããŸããã ã¡ãã»ãŒãžãç¹å®ã®1ã€ã®ãšãŒãžã§ã³ãã«å®ãŠãããŠããå ŽåãMPMC-mboxã®äœ¿çšã¯å¹æçã§ãªãããšãçµéšã«ãã瀺ãããŠããŸãã ãã®ãããMPSC-mboxã¯ãçžäºäœçšã®çµç¹ã«å¯Ÿããæ ¹æ¬çã«ç°ãªãã¢ãããŒãã§ã¯ãªããã³ãŒããæé©åããããã®æ¹æ³ã§ãããšèšããŸãã ããã«ããŠãŒã¶ãŒã¯MPSC-mbox-sãäœæã§ããŸããã åãšãŒãžã§ã³ãã®MPSC-mboxã¯ãSObjectizerã«ãã£ãŠèªåçã«äœæãããŸãã
so_5_extraã©ã€ãã©ãªããã®è¿œå ã®mbox
è¿œå ã®so_5_extraã©ã€ãã©ãªãSObjectizerãä»ããŠæ§ç¯ãããŸãããããã«ã¯ãSObjectizerãã«ãŒãã«ã«è¿œå ããã®ã¯äžåçãšæãããã³ã³ããŒãã³ããå«ãŸããŠããŸãã ããã€ãã®è¿œå ã¿ã€ãã®mbox-sãå«ãŸããŠããŸãã äŸïŒ
- round_robin mboxã®ã¿ã¹ã¯ã¯ãåä¿¡è ã«é çªã«ã¡ãã»ãŒãžãéä¿¡ããããšã§ãã
- retain_msg mboxã¯ãæåŸã«éä¿¡ãããã¡ãã»ãŒãžã®ã€ã³ã¹ã¿ã³ã¹ãæ ŒçŽãããã®ã€ã³ã¹ã¿ã³ã¹ãæ°ããåãµãã¹ã¯ã©ã€ããŒã«ããã«éä¿¡ããŸãïŒããã«ããããµãã¹ã¯ã©ã€ããŒã¯mboxã«éä¿¡ãããæåŸã®å€ãèªåçã«åä¿¡ããŸãïŒã
mboxã䜿çšããå¥ã®èå³æ·±ãäŸã¯ãso_5_extra ã®shutdownerã³ã³ããŒãã³ãã§ãã ãã®ã³ã³ããŒãã³ãã§ã¯ã mboxã䜿çšããŠã倧èŠæš¡ãªSObjectizerã¢ããªã±ãŒã·ã§ã³ãæ£ããã·ã£ããããŠã³ã§ããã¿ã€ãã³ã°ã決å®ããŸãã
ãã ãããã®èšäºã§ã¯so_5_extraã®mbox-sã詳现ã«æ€èšããŸããã
Multi-Producer / Single-Consumer mboxã¯ã©ã®ããã«æ©èœããŸããïŒ
ãã®ãããmbox-sã¯ç°ãªããããåäœãç°ãªããŸãã ãããŠãæãåçŽãªMPSC-mboxã§äœæ¥ã®è©³çŽ°ãæ€èšãå§ããŸãã
message_limits ïŒããã¯ãšãŒãžã§ã³ããéè² è·ããä¿è·ããã¡ã«ããºã ã§ãïŒãmsg_tracing ïŒããã¯ã¡ãã»ãŒãžãåä¿¡è ã«é ä¿¡ãããæ¹æ³ã調ã¹ãæ¹æ³ã§ãïŒãªã©ã®ç¹å®ã®ããšãèæ ®ããªãå ŽåãMPSC-mboxã¯åçŽãªãåå°äœãã®ããã«æ©èœããŸããéä¿¡ãããã¡ãã»ãŒãžãåä¿¡è ãšãŒãžã§ã³ãã«éä¿¡ããŠãåä¿¡è ãã¡ãã»ãŒãžããã¥ãŒã«å ¥ããŠã¡ãã»ãŒãžåŠçãåŸ æ©ããããã«ããŸãã
ãŸãã€ãŸã ããã§ã¯ãã¹ãŠãéåžžã«æãã§ããéä¿¡è ããã¡ãã»ãŒãžãåãåããåä¿¡è ã«ãããæž¡ããŸããã ãã以äžã
Multi-Producer / Multi-Consumer mboxã¯ã©ã®ããã«æ©èœããŸããïŒ
ããããMPMC-mboxã§ã¯ãç¶æ³ã¯ããå°ãè€éã§ãïŒããã§ããmessage_limitsãmsg_tracingãªã©ãèæ ®ããŠããŸããïŒã å€ãã®ã¡ãã»ãŒãžåä¿¡è ãååšããå¯èœæ§ããããããMPMC-mboxã¯ããµãã¹ã¯ã©ã€ããŒãšã®é¢é£ä»ãã³ã³ãããŒãä¿åããŸãã ãã®ã³ã³ããå ã®ããŒã¯ã¡ãã»ãŒãžã¿ã€ãã®èå¥åã§ãããèŠçŽ ã¯ãã®ã¿ã€ãã®ã¡ãã»ãŒãžã®ãµãã¹ã¯ã©ã€ãã®å®éã®ãªã¹ãã§ãã
誰ããã¿ã€ãMã®ã¡ãã»ãŒãžãéä¿¡ãããšãMPMC-mboxã¯ãã®Mã®ã¡ãã»ãŒãžã®ãµãã¹ã¯ã©ã€ããŒã®ãªã¹ããé£æ³ã³ã³ãããŒã§æ¢ããŸãããã®ãããªãªã¹ããããå ŽåãMPMC-mboxã¯ãã®ãªã¹ãã調ã¹ãŠãåãµãã¹ã¯ã©ã€ããŒã«ã¡ãã»ãŒãžãéä¿¡ããããšããŸãã
å ·äœçã«ã¯ãäžããããšããããšèšãããŸããã delivery_filters ïŒã€ãŸããã¡ãã»ãŒãžã®å 容ã«å¿ããŠããµãã¹ã¯ã©ã€ããŒãžã®ã¡ãã»ãŒãžé ä¿¡ãæå¹ãŸãã¯ç¡å¹ã«ãããã£ã«ã¿ãŒïŒãªã©ããŸã ãããŸãã ã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ããããšãŒãžã§ã³ãã«é ä¿¡ãããåã«ãMPMC-mboxã¯ããµãã¹ã¯ã©ã€ããŒã«delivery_filterããããã©ããã確èªããŸãã ååšããå Žåãã¡ãã»ãŒãžã¯æåã«ãã£ã«ã¿ãŒã«éä¿¡ãããŸãã ãŸãããã£ã«ã¿ãŒããšãŒãžã§ã³ããžã®ã¡ãã»ãŒãžã®é ä¿¡ãèš±å¯ããå Žåã«ã®ã¿ããã®ã¡ãã»ãŒãžã¯ãšãŒãžã§ã³ãã«éä¿¡ãããŸãã
äžè¬ã«ãMPMC-mboxã¯ç¹å®ã®çš®é¡ã®ã¡ãã»ãŒãžã®ãµãã¹ã¯ã©ã€ããŒã®ãªã¹ãã調ã¹ãã¡ãã»ãŒãžã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ãžã®é ä¿¡ããµãã¹ã¯ã©ã€ããŒã«èš±å¯ãããŠããå Žåãã¡ãã»ãŒãžã¯ãµãã¹ã¯ã©ã€ããŒãšãŒãžã§ã³ãã«éä¿¡ããããµãã¹ã¯ã©ã€ããŒã¯ã¡ãã»ãŒãžã®åŠçãé çªã«åŸ æ©ããŸãã
éåžžã®MPMCãšMPSC mboxã®å ±éç¹ã¯äœã§ããïŒ
éåžžã®MPMCããã³MPSC mboxã«ã¯ãããããçµåãã1ã€ã®éèŠãªæ©èœããããŸããmboxã«ã¯ãmboxã«éä¿¡ãããã¡ãã»ãŒãžã®ç¬èªã®ãªããžããªããããŸããã ããªãã¡ å°ãªããšãéåžžã®mboxã¯ãã¡ãã»ãŒãžãä¿åããŸããã äžè¬çã«ã
ãããã£ãŠãã mboxããªãŒããŒãããŒãããŸã§äœä»¶ã®ã¡ãã»ãŒãžãä¿åã§ãããªãŒããŒãããŒãããšã©ããªããŸããïŒ ããŸãã¯ã ã¡ãã»ãŒãžMãéä¿¡ãããåŸã«ã¡ãã»ãŒãžMããµãã¹ã¯ã©ã€ããããšããšãŒãžã§ã³ãBã¯ã¡ãã»ãŒãžMãåä¿¡ããŸããïŒ ã MPMCãšMPSC mboxã¯æå³ããããŸããã ãããã®mboxã«ã€ããŠã¯ãæããªããšã«ã¡ãã»ãŒãžãèªèº«ã®å éšã«ä¿åããŸãããã¡ãã»ãŒãžã¯ãã¡ãã»ãŒãžã«èå³ããããšãŒãžã§ã³ãã«ããã«è»¢éãããŸãã ãŸãã¯ããã®ã¿ã€ãã®ã¡ãã»ãŒãžã®åä¿¡è ãçŸåšããªãå Žåãã¡ãã»ãŒãžãç¡èŠããŸãã
ãŸããä»ã®ã¿ã€ãã®mboxã®å Žåãéä¿¡ãããã¡ãã»ãŒãžã®å éšã¹ãã¬ãŒãžã¯æšæºã§ã¯ãªãã«ãŒã«ã®äŸå€ã§ãã å®éãmboxã®æäœã¯ããã·ã¥ååã«åºã¥ããŠããŸããéä¿¡ãããã¡ãã»ãŒãžã¯mboxã«ãè©°ã蟌ãŸãããŸãã ãããŠãããã¯ãããããmboxã誰ãã«ã¡ãã»ãŒãžãé ä¿¡ããå¯äžã®æ©äŒã§ãã 誰ãmboxã«æ°ãããã®ãçŸãããã©ããã確èªããããã«mboxãå®æçã«ãã«ããããšã¯ãããŸããã ããªã㡠誰ãããŸã£ããã誰ãããã«ã¢ãŒãã®mboxã§ã¯åäœããŸããã
çµè«ãšããŠãäžè¬çã«ãmbox-sã¯ã¡ãã»ãŒãžãå éšã«ä¿åããŸããã
äžçã®ç¶æ³ãè€éã«ããŠããïŒãšãŒãžã§ã³ãã«ã¯ç¬èªã®ã¡ãã»ãŒãžãã¥ãŒããªã
SObjectizerã«çŽé¢ããéçºè ã¯ãmboxãã¡ãã»ãŒãžãä¿åããªãããšãããã«èªèãå§ãããããmboxã®å®¹éã«ã€ããŠè³ªåããããšã¯æå³ããããŸããã ããããã¡ãã»ãŒãžã¯mboxã«ã¯ä¿åãããããšãŒãžã§ã³ããšå ±ã«ä¿åãããããããšãŒãžã§ã³ãã®ã¡ãã»ãŒãžãã¥ãŒã®å®¹éã«é¢ãã質åãå§ãŸããŸã...
ãããŠãããã§æ°èŠåå ¥è ã¯ããäžã€ã®å瀺ãåãããããã倱æããã§ãããïŒSObjectizerã§ã¯ããšãŒãžã§ã³ãã¯äžè¬çãªå Žåãç¬èªã®ã¡ãã»ãŒãžãã¥ãŒãæã£ãŠããŸããã
è¡ãã ãã¹ãŠã§ã¯ãããŸãã:)
å®éãSObjectizerã®ãšãŒãžã§ã³ãã®ã¡ãã»ãŒãžãã¥ãŒã¯ãã£ã¹ãããã£ã«ãã£ãŠå¶åŸ¡ãããŸãã ãšãŒãžã§ã³ããã¡ãã»ãŒãžãåŠçããäœæ¥ã³ã³ããã¹ãããšãŒãžã§ã³ãã«æäŸããã®ã¯ãã£ã¹ãããã£ã§ãã ãããŠãçµæãšããŠãåŠçãåŸ æ©ããŠããã¡ãã»ãŒãžã®ã¹ãã¬ãŒãžãç·šæããã®ã¯ãã£ã¹ãããã£ã§ãã
ããšãã°ãone_threadïŒæãäžè¬çã«äœ¿çšããããã®ã®1ã€ïŒã®ãããªãã£ã¹ãããã£ããããŸãã ãã®ãã£ã¹ãããã£ã«é¢é£ä»ããããŠãããã¹ãŠã®ãšãŒãžã§ã³ãã¯ãåäžã®å ±éã®äœæ¥ã¹ã¬ããã§åäœããŸãã ãããŠããã¹ãŠã®ãšãŒãžã§ã³ãã®ãã¹ãŠã®ã¡ãã»ãŒãžã¯ã1ã€ã®å ±éã¡ãã»ãŒãžãã¥ãŒã«ä¿åãããŸãã äœæ¥ã¹ã¬ããã¯ãã®ãã¥ãŒãã次ã®ã¡ãã»ãŒãžãååŸããåä¿¡ãšãŒãžã§ã³ãã«æž¡ãã次ã®ã¡ãã»ãŒãžãååŸããŸãã
active_groupã¿ã€ãã®ãã£ã¹ãããã£ã¯ããšãŒãžã§ã³ãã®ã°ã«ãŒãã1ã€ã®å ±éã®äœæ¥ã¹ã¬ããã«é¢é£ä»ããããšãã§ããåæ§ã®æ¹æ³ã§åäœããŸãã ãããŠããã®äœæ¥ã¹ã¬ããäžã®ãã¹ãŠã®ãšãŒãžã§ã³ãã¯ãå ±éã®ã¡ãã»ãŒãžãã¥ãŒã䜿çšããŸãã
åä»ãªç¶æ³ã¯ãthread_poolããã³adv_thread_poolãã£ã¹ãããã£ãŒã®å Žåã§ãã ããã§ããšãŒãžã§ã³ãã®FIFOãã¥ãŒã®ãã©ã¡ãŒã¿ãŒãèšå®ã§ããŸãã ãããã®1ã€ã¯ããšãŒãžã§ã³ãã䜿çšãããã¥ãŒã§ãã ãšãŒãžã§ã³ãã«ç¬èªã®ãã¥ãŒãæãããããšãã§ããŸãããã®ãã¥ãŒã«ã¯ããã®ç¹å®ã®ãšãŒãžã§ã³ãã«å®ãŠãããã¡ãã»ãŒãžã®ã¿ãååšããŸãã ãŸããåãååé¢ä¿ã«ãããšãŒãžã§ã³ããå ±éã®ã¡ãã»ãŒãžãã¥ãŒãå ±æããããã«ã§ããŸãã
ãšãŒãžã§ã³ãã®åªå é äœããµããŒããããã£ã¹ãããã£ã§ããã«æ¥œãããªããŸãã ããšãã°ããã£ã¹ãããã£prio_one_thread :: strictly_orderedã ããã§ã¯ãåãåªå 床ãæã€ãã¹ãŠã®ãšãŒãžã§ã³ãã«å ±éã®ã¡ãã»ãŒãžãã¥ãŒã1ã€ãããŸãã ãã ããåªå é äœãç°ãªããšãŒãžã§ã³ãã®å Žåãã¡ãã»ãŒãžãã¥ãŒã¯ç°ãªããŸãã
èŠããã«ãæçµè¡ïŒäžè¬çã«ãmboxã¯ãšãŒãžã§ã³ãã«ã¡ãã»ãŒãžãéä¿¡ãããšãŒãžã§ã³ãã¯æ¢ã«é©åãªãã¥ãŒã«ã¡ãã»ãŒãžãä¿åããŠãããã£ã¹ãããã£ã«ã¡ãã»ãŒãžãéä¿¡ããŸãã ãããã£ãŠãããã§ããäžè¬çãªå Žåãmbox-sããšãŒãžã§ã³ãã«ãã¡ãã»ãŒãžçšã®ã¹ãã¬ãŒãžããããŸããã
ãŸããç¬èªã®mboxãäœæããã®ã¯ã©ããããé£ããã§ããïŒ
message_limitsãdelivery_filtersãmsg_tracingããã³ãã®ä»ã®ãã¥ã¢ã³ã¹ããµããŒãããŠããã¹ãŠã®ã«ãŒã«ã§ããããè¡ãå Žåãããã¯éåžžã«å°é£ã§ãã ããšãã°ã so_5_extraã®retain_msg mboxã®å®è£ ã®å èãèŠãŠããããã©ãã ãæãã®ããèŠãããšãã§ããŸã:)
ãã ããç¹å®ã®ã¿ã¹ã¯ã®ããã«ç¬èªã®mboxãå®è¡ãããå Žåããã¹ãŠãããã»ã©ã²ã©ããã®ã«ãªãããšã¯ãããŸããã MPSC-mboxãå°ããªäŸãšããŠäœæããŠã¿ãŸããããããã«ããããšãŒãžã§ã³ããé »ç¹ã«ã¡ãã»ãŒãžãåä¿¡ããã®ãé²ãããšãã§ããŸãã ããšãã°ãM1ã¡ãã»ãŒãžã®åŸã«250ããªç§æªæºã§M2ã¡ãã»ãŒãžãå°çããå Žåããã®ã¡ãã»ãŒãžã¯ç Žæ£ãããŸãã M1ã250ããªç§ä»¥äžçµéããåŸãM2ãåä¿¡è ã«é ä¿¡ãããŸãã
å¿ èŠãªèª¬æ
ããã§ã¯ãã³ãŒãåanti-jitter-mboxã§ç¬èªã®mboxãäœæããŠã¿ãŸãããã ããã¯MPSC-mboxã«ãªããç¹å®ã®ãšãŒãžã§ã³ãã«é¢é£ä»ããå¿ èŠããããŸãã
ç§ãã¡ã®ç掻ãç°¡çŽ åããããã«ãMPSC-mboxã®ç¬èªã®å®å šãªå®è£ ã¯äœæããŸããã 代ããã«ãåãšãŒãžã§ã³ãçšã®æ¢è£œã®MPSC-mboxã䜿çšããŸãã anti-jitter-mboxãMPSC-mboxã³ã³ã¹ãã©ã¯ã¿ãŒã«å±ãããšãŒãžã§ã³ãããanti-jitter-mboxã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãã ãã§ãã
ç¬èªã®ã¯ã©ã¹anti_jitter_mboxãå®çŸ©ããå¿ èŠããããŸããããã¯ç¹å¥ãªã¯ã©ã¹so_5 :: absctract_message_mbox_tã®åå«ã§ãªããã°ãªããŸããã ãã®ã¯ã©ã¹ã§ã¯ãabsctract_message_mbox_tã«ããçŽç²ãªä»®æ³ã¡ãœããããªãŒããŒã©ã€ãããå¿ èŠããããŸãã SObjectizerããŒãžã§ã³5.5ã*ã§ã¯ã次ã®ã¡ãœããããããŸãã
idïŒïŒ ã äžæã®mbox IDãè¿ãå¿ èŠããããŸãã ã¡ãã»ãŒãžé ä¿¡ã¯ãå®éã«ã¯ã³ã³ã¹ãã©ã¯ã¿ã§æž¡ãããMPSC-mboxãšãŒãžã§ã³ãã«ãã£ãŠå®è¡ãããããããã®ç¹å®ã®MPSC-mboxã®IDãè¿ããŸãã ããªãã¡ ããã§ã¯ãåã«çŸåšã®MPSC-mboxã«äœæ¥ãå§ä»»ããŸãã
subscribe_event_handlerïŒïŒ ã ãã®ã¡ãœããã¯ããšãŒãžã§ã³ããã¿ã€ãTã®ã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ããããšãã«åŒã³åºãããŸãããã®ã¡ãœããã«ã¿ã€ãTãç»é²ããŸããããã¿ã€ãMã®ã¡ãã»ãŒãžãmboxã«å°çãããšãã«ããšãŒãžã§ã³ãããµãã¹ã¯ã©ã€ãããŠãããã©ããã確èªã§ããããã«ããŸãã 眲åãããŠããå Žåãã¡ãã»ãŒãžã®é ä¿¡ãè©Šã¿ãããšãã§ããŸãïŒããã«å¿ããŠãæåŸã®é ä¿¡ã®æå»ãä¿®æ£ããå¿ èŠããããŸãïŒã 眲åãããŠããªãå Žåãã¡ãã»ãŒãžã¯ç¡èŠããå¿ èŠããããŸãã
unsubscribe_event_handlersïŒïŒ ã subscribe_event_handlerïŒïŒãšã¯å¯Ÿç §çã«ããã®ã¡ãœããã¯ããšãŒãžã§ã³ããã¿ã€ãTã®ã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ã解é€ãããšãã«åŒã³åºãããŸãããã®ã¡ãœããã§ã¿ã€ãTã®ç»é²ããã£ã³ã»ã«ããŸãã
query_nameïŒïŒ ã ãã®ã¡ãœããã¯ãmboxã®æåååãè¿ãå¿ èŠããããŸãã ãã®ã¡ãœããã¯ããããã°ãšèšºæã®ç®çã«åœ¹ç«ã¡ãŸãã ããšãã°ãSObjectizerã¯ãçºçãããšã©ãŒã«é¢ããã¡ãã»ãŒãžãçæãããšãã«ãã®ã¡ãœããããã«ã§ããŸãã
ã¿ã€ãïŒïŒ ã ãã®ã¡ãœããã¯ãmboxã¿ã€ããè¿ããŸããmboxããã«ããããã¥ãŒãµãŒ/ãã«ãã³ã³ã·ã¥ãŒããŒãããã«ããããã¥ãŒãµãŒ/ã·ã³ã°ã«ã³ã³ã·ã¥ãŒããŒããè¿ããŸãã ãã®ã¡ãœããã¯ãç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ãããã©ããã確èªããããã«SObjectizerã«ãã£ãŠåŒã³åºãããŸãã ããšãã°ã å€æŽå¯èœãªã¡ãã»ãŒãžã¯MPSC mboxã«ã®ã¿éä¿¡ã§ããŸã ã
do_deliver_messageïŒïŒ ã ãã®ã¡ãœããã¯ãåä¿¡ãšãŒãžã§ã³ãã«ã¡ãã»ãŒãžãéä¿¡ããŸãã ãã®ã¡ãœããã§ã¯ãéä¿¡ãããã¡ãã»ãŒãžã®ã¿ã€ããç»é²ãããŠãããã©ããã確èªããå¿ èŠããããŸãã ããã§ãªãå Žåãã¡ãã»ãŒãžã¯ç¡èŠãããŸãã ç»é²ãããŠããŠãæåŸã«ã¡ãã»ãŒãžãé ä¿¡ãããŠããååãªæéãçµéããå Žåãã¡ãã»ãŒãžãåä¿¡è ã«é ä¿¡ããå¿ èŠããããŸãïŒãã®å Žåãé ä¿¡æéãä¿®æ£ããŸãïŒã é ä¿¡èªäœã¯ãå®éã®MPSC-mboxãšãŒãžã§ã³ãã«å§ä»»ãããŸãã
do_deliver_service_requestïŒïŒ ã ãã®ã¡ãœããã¯do_deliver_messageïŒïŒã«äŒŒãŠããŸããããšãŒãžã§ã³ãAããšãŒãžã§ã³ãBã«åæãªã¯ãšã¹ããè¡ã£ããšãã«åŒã³åºãããŸãïŒã€ãŸããsend_messageã®ä»£ããã«request_futureãŸãã¯request_valueã䜿çšãããŸãïŒã ç°¡åã«ãããããanti-jitter-mboxã®åæãªã¯ãšã¹ãæ©èœã¯ãµããŒãããŸããã
set_delivery_filterïŒïŒããã³drop_delivery_filterïŒïŒ ãããã®ã¡ãœããã¯ãã¡ãã»ãŒãžé ä¿¡ãã£ã«ã¿ãŒãèšå®ããã³åé€ããããã«äœ¿çšãããŸãã é ä¿¡ãã£ã«ã¿ãŒã¯MPSC-mboxåãã§ã¯ãªãããããã®äŸã§ã¯ãã®æ©èœããµããŒãããŸããã
ããã€ãã®abstract_message_mbox_tã¡ãœããã®äžè²«æ§ã®èª¬æ
ãã®äŸã®å®è£ ã§ã¯ãdo_deliver_messageïŒïŒããã³do_deliver_service_requestïŒïŒã¡ãœãããå®æ°ãšããŠå®£èšãããŠããããšãããããŸãã ãããããªããªã do_deliver_messageïŒïŒã§ã¯ãanti-jitter-mboxã®å éšç¶æ ãå€æŽããå¿ èŠããããŸãã次ã«ãmboxã¯ã©ã¹ã®èª¬æã§ãã®åãç¶æ ãå¯å€ãšããŠããŒã¯ããå¿ èŠããããŸãã
ããã¯ãabstract_message_mbox_tã¯ã©ã¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ã®åœ¢æã«ãããå€ä»£ã®ã¢ãŒããã¯ãã£ã®èª€ç®ã®çµæã§ãã ãã®ã¯ã©ã¹ãäœå¹Žãåã«åœ¢æããããšãã誰ããç¬èªã®ã¿ã€ãã®mboxãäœæããå¿ èŠããããšã¯èããŠããŸããã§ããã
1幎ååã«å¿ èŠã§ããã ãã§ãªããæã«ã¯éåžžã«å¿ èŠã§ããããšãå€æãããšããSObjectizer-5.5ãã©ã³ãå ã®äºææ§ãç Žããããã¹ãŠããã®ãŸãŸã«ããŠãå°æ¥ã®ã¡ãžã£ãŒãªãªãŒã¹ã§abstract_message_mbox_tã€ã³ã¿ãŒãã§ãŒã¹ãå€æŽãããšããéžæã«çŽé¢ããŸããïŒSObjectizer-5.6ãªã©ïŒã åããã©ã³ãå ã®ãªãªãŒã¹éã®äºææ§ãç¶æããããšã«ã€ããŠã¯éåžžã«éèŠãªã®ã§ãSObjectizer-5.5ã§ã¯ãã¹ãŠããã®ãŸãŸã«ããããšã«ããŸããã ãã®ãããç¬èªã®mboxãå®è£ ããå Žåãããã€ãã®abstract_message_mbox_tã¡ãœããã®äžå€æ§ãèæ ®ããmutableããŒã¯ãŒãã䜿çšããå¿ èŠããããŸãã
ç¬èªã®anti-jitter-mboxã®å®è£
ããŠãç§ãã¡ã¯èªåã®mboxãã©ã®ããã«ãªããããã§ã«èŠãããšãã§ããŸãã
mboxãåŠçããããŒã¿ããå§ããŸãããïŒ
using namespace std::chrono; using clock_type = steady_clock; class anti_jitter_mbox : public so_5::abstract_message_box_t { // , // // . struct data { // . struct item { // . 0 , // . std::size_t subscribers_{0}; // . // , . std::optional<clock_type::time_point> last_received_{}; }; // , // . using message_table = std::map<std::type_index, item>; // mutex mbox- // . std::mutex lock_; // , . message_table messages_; }; // mbox-. // mbox, . const so_5::mbox_t mbox_; // "" . const clock_type::duration timeout_; // mbox-. SObjectizer-5.5 // mutable, .. // const-. mutable data data_;
åä¿¡è ãšãŒãžã§ã³ããžã®ã¡ãã»ãŒãžé ä¿¡ãè¡ãããå®éã®mboxããäžèŠãªãã¡ãã»ãŒãžãé®æããããã®æéãããå€ãããã³å®éã«ã¡ãã»ãŒãžã®ã¿ã€ããšæåŸã«åä¿¡ãããæéã«é¢ããæ å ±ãå¿ èŠã§ãã ããã«ãmboxã¡ãœããã¯ç°ãªãäœæ¥ã¹ã¬ããã§åŒã³åºãããšãã§ããmboxã«ã¹ã¬ããã»ãŒããæäŸããå¿ èŠãããããããã¥ãŒããã¯ã¹ãå¿ èŠã§ãã
ãšããã§ãã»ãšãã©ã®ã¡ãœããã§ã¹ã¬ããã»ãŒãã§ãããšããçç±ã ãã§ãmboxã®å éšãã¥ãŒããã¯ã¹ããã£ããã£ããå¿ èŠããããŸãã ç§ãã¡ã®ç掻ãç°¡çŽ åããããã«ãè£å©ãã³ãã¬ãŒãã¡ãœãããäœæããŸãããã®ã¡ãœããã¯ããã¥ãŒããã¯ã¹ããã£ããã£ãããã£ããã£ãããã¥ãŒããã¯ã¹ã®äžã§å¿ èŠãªã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
template<typename Lambda> decltype(auto) lock_and_perform(Lambda l) const noexcept { std::lock_guard<std::mutex> lock{data_.lock_}; return l(); }
ååãšããŠããã®ååšã¯å¿ èŠãããŸããã ãããã次ã®çç±ã§ããã䜿çšããããšã«ããŸãããå®è£ ãç°¡åã«ããããã«ãäŸå€ã®å®å šæ§ãªã©ãæ°ã«ããŸããã äžéšã®ã¢ã¯ã·ã§ã³äžã«äŸå€ãçºçããå Žåãã¢ããªã±ãŒã·ã§ã³å šäœãäžæããã ãã§ãã lock_and_performã¯noexceptãšããŠããŒã¯ããããã®åäœãæäŸããŸã-ã©ã ããäŸå€ãã¹ããŒãããšãC ++ã©ã³ã¿ã€ã èªäœãstd :: terminateãåŒã³åºããŸãã
ããŠãmboxèªäœã®å®éã®å®è£ ãèŠãããšãã§ããŸãïŒ
public: // . MPSC-mbox, // . anti_jitter_mbox( so_5::mbox_t actual_mbox, clock_type::duration timeout) : mbox_{std::move(actual_mbox)} , timeout_{timeout} {} // ID mbox-. ID mbox-. so_5::mbox_id_t id() const override { return mbox_->id(); } // . void subscribe_event_handler( const std::type_index & msg_type, const so_5::message_limit::control_block_t * limit, so_5::agent_t * subscriber ) override { lock_and_perform([&]{ // . // , . auto & msg_data = data_.messages_[msg_type]; msg_data.subscribers_ += 1; // mbox-. mbox_->subscribe_event_handler(msg_type, limit, subscriber); }); } // . void unsubscribe_event_handlers( const std::type_index & msg_type, so_5::agent_t * subscriber ) override { lock_and_perform([&]{ // . // , . auto it = data_.messages_.find(msg_type); if(it != data_.messages_.end()) { auto & msg_data = it->second; --msg_data.subscribers_; if(!msg_data.subscribers_) // , // . data_.messages_.erase(it); // mbox . mbox_->unsubscribe_event_handlers(msg_type, subscriber); } }); } // mbox-. std::string query_name() const override { return "<mbox:type=anti-jitter-mpsc:id=" + std::to_string(id()) + ">"; } // mbox-. , . so_5::mbox_type_t type() const override { return mbox_->type(); } // . void do_deliver_message( const std::type_index & msg_type, const so_5::message_ref_t & message, unsigned int overlimit_reaction_deep ) const override { lock_and_perform([&]{ // . // , // . auto it = data_.messages_.find(msg_type); if(it != data_.messages_.end()) { auto & msg_data = it->second; const auto now = clock_type::now(); // , . // (.. last_received_ // ), . bool should_be_delivered = true; if(msg_data.last_received_) { should_be_delivered = (now - *(msg_data.last_received_)) >= timeout_; } // - , mbox // // . if(should_be_delivered) { msg_data.last_received_ = now; mbox_->do_deliver_message(msg_type, message, overlimit_reaction_deep); } } }); } // . void do_deliver_service_request( const std::type_index & /*msg_type*/, const so_5::message_ref_t & /*message*/, unsigned int /*overlimit_reaction_deep*/ ) const override { // , so_5::exception_t // , SObjectizer-. SO_5_THROW_EXCEPTION(so_5::rc_not_implemented, "anti-jitter-mbox doesn't support service requests"); } // MPSC-mbox- . // . void set_delivery_filter( const std::type_index & /*msg_type*/, const so_5::delivery_filter_t & /*filter*/, so_5::agent_t & /*subscriber*/ ) override { SO_5_THROW_EXCEPTION(so_5::rc_not_implemented, "anti-jitter-mbox doesn't support delivery filters"); } void drop_delivery_filter( const std::type_index & /*msg_type*/, so_5::agent_t & /*subscriber*/ ) noexcept override { SO_5_THROW_EXCEPTION(so_5::rc_not_implemented, "anti-jitter-mbox doesn't support delivery filters"); } };
ããŠãmboxã®åäœããã¹ãããã«ã¯ãäºãã«é¡äŒŒãã2ã€ã®ãã¹ããšãŒãžã§ã³ããäœæããå¿ èŠããããŸããæåã®ãšãŒãžã§ã³ãã®ã¿ããéåžžã®MPSC-mboxããã¡ãã»ãŒãžãåä¿¡ããå¿ èŠããããŸãã
class ordinary_subscriber final : public so_5::agent_t { const std::string name_; public: ordinary_subscriber(context_t ctx, // , . std::string name) : so_5::agent_t{std::move(ctx)} , name_{std::move(name)} { so_subscribe_self().event([&](mhood_t<std::string> cmd) { std::cout << name_ << ": signal received -> " << *cmd << std::endl; }); } // Mbox, . auto target_mbox() const { return so_direct_mbox(); } };
ãããŠããã®ç®çã®ããã®2çªç®ã®ãšãŒãžã§ã³ãã¯anti-jitter-mboxã䜿çšããŸãã
class anti_jitter_subscriber final : public so_5::agent_t { const std::string name_; const so_5::mbox_t anti_jitter_mbox_; public: anti_jitter_subscriber(context_t ctx, // , . std::string name, // , // "" . clock_type::duration jitter_threshold) : so_5::agent_t{std::move(ctx)} , name_{std::move(name)} , anti_jitter_mbox_{ new anti_jitter_mbox{so_direct_mbox(), jitter_threshold}} { // mbox. so_subscribe(anti_jitter_mbox_).event([&](mhood_t<std::string> cmd) { std::cout << name_ << ": signal received -> " << *cmd << std::endl; }); } // Mbox, . auto target_mbox() const { return anti_jitter_mbox_; } };
ããŠãããããã¹ãå®è¡ã®ããã«ãã¹ãŠèµ·åãããæ¹æ³ã§ãïŒ
// . void generate_msg_sequence( so_5::environment_t & env, const so_5::mbox_t & ordinary_mbox, const so_5::mbox_t & anti_jitter_mbox) { std::vector<milliseconds> delays{ 125ms, 250ms, 400ms, 500ms, 700ms, 750ms, 800ms }; for(const auto d : delays) { const std::string msg = std::to_string(d.count()) + "ms"; so_5::send_delayed<std::string>(env, ordinary_mbox, d, msg); so_5::send_delayed<std::string>(env, anti_jitter_mbox, d, msg); } } int main() { // SObjectizer . so_5::launch([](so_5::environment_t & env) { // mbox-. // . so_5::mbox_t ordinary, anti_jitter; // , // mbox. env.introduce_coop([&](so_5::coop_t & coop) { ordinary = coop.make_agent<ordinary_subscriber>( "ordinary-mbox")->target_mbox(); anti_jitter = coop.make_agent<anti_jitter_subscriber>( "anti-jitter-mbox", 250ms)->target_mbox(); }); // . generate_msg_sequence(env, ordinary, anti_jitter); // . std::this_thread::sleep_for(1250ms); // . env.stop(); }); return 0; }
ãµã³ãã«ãå®è¡ããçµæãanti-jitter-mboxã䜿çšãããšãŒãžã§ã³ãã¯ãéåžžã®mboxã䜿çšãããšãŒãžã§ã³ããããå°ãªãã¡ãã»ãŒãžãåŠçããããšãããããŸãã
éåžžã®mboxïŒåä¿¡ä¿¡å·-> 125ms anti-jitter-mboxïŒåä¿¡ä¿¡å·-> 125ms éåžžã®mboxïŒåä¿¡ããä¿¡å·-> 250ms éåžžã®mboxïŒåä¿¡ããä¿¡å·-> 400ms anti-jitter-mboxïŒåä¿¡ä¿¡å·-> 400ms éåžžã®mboxïŒä¿¡å·ãåä¿¡-> 500ms éåžžã®mboxïŒåä¿¡ä¿¡å·-> 700ms anti-jitter-mboxïŒåä¿¡ä¿¡å·-> 700ms éåžžã®mboxïŒä¿¡å·åä¿¡-> 750ms éåžžã®mboxïŒåä¿¡ããä¿¡å·-> 800ms
äŸä»ãã®ãªããžããª
ãã®èšäºã®äŸã®å®å šãªãœãŒã¹ã³ãŒãã¯ããã®ãªããžããªã«ãããŸãã
ãšãããŒã°
èšäºã®çµããã«ãæåŸãŸã§èªã¿éãå¿èãæã£ãèªè ã«æè¬ããããšæããŸããããã¯ããªããããããã£ããããããšããç°¡åã§ã¯ãããŸããã§ãã:)
ç§ãã¡ã¯ãã»ãã®å°ãã®ãã¥ãŒã¹ãå ±æãããïŒSObjectizerãšso_5_extraã®æŽæ°ããŸããããŒãžã§ã³5.5.20ãŸã§ã®SObjectizerãããŒãžã§ã³1.0.3ãŸã§ã®so_5_extraãSObjectizerã¯ãvcpkgäŸåé¢ä¿ç®¡çã·ã¹ãã ãããå©çšã§ããŸãããããã£ãŠãvcpkg install sobjectizerã䜿çšããŠSObjectizerãã€ã³ã¹ããŒã«ã§ããŸãã
ãŸããæ¥å¹ŽãSObjectizerã®æ¬¡ã®ã¡ãžã£ãŒããŒãžã§ã³ã§ãããããŒãžã§ã³5.6ã§äœæ¥ãéå§ããäºå®ã§ããããŒãžã§ã³5.6ã§ã¯ãäºææ§ã®ããã«ãã«ããå€ãããŒããåé€ããå Žåã«ãã£ãŠã¯ããŒãžã§ã³5.5ãšã®äºææ§ãç Žå£ããŸããSObjectizer-5.6ã®ããã€ãã®äºåçãªèæ ®äºé ãããã«ç€ºããŸããSObjectizerã®å°æ¥ã®ããŒãžã§ã³ã§äœãèŠããããSObjectizerã®éçºã®ã©ã®æ¹åãããªãã«èå³ããããã«ã€ããŠãSObjectizerã«èå³ããã人ã®æèŠãèãããšã¯çŽ æŽãããããšã§ãã
誰ããSObjectizerã®åäœã®è©³çŽ°ãç¥ãããå Žåã¯ãã³ã¡ã³ãã§è³ªåããŠãã ãããçããããšããŸãããŸããçãã«é·ãããã¹ããå¿ èŠãªå Žåã¯ãå¥ã®èšäºãèŠã€ãããããããŸããã