ç§ã¯ãã®æ©äŒã«ã次ã®å€§èŠæš¡ãªã«ã³ãã¡ã¬ã³ã¹ããã³ã¹ã¯ã§éå¬ãã è¬æŒããæ©äŒãäžããŠãããCoreHardã³ãã¥ããã£ã«æè¬ã®æãè¡šããŸãã ãŸããYouTubeã®ã¬ããŒãã®ãããªã¬ããŒããè¿ éã«å ¬éããããã«ã
ããã§ã¯ãäŒè©±ã®äž»ãªãããã¯ã«ç§»ããŸãããã ã€ãŸããC ++ã§ãã«ãã¹ã¬ããããã°ã©ãã³ã°ãç°¡çŽ åããããã«äœ¿çšã§ããã¢ãããŒãããããã®ã¢ãããŒãã®äžéšãã³ãŒãã§ã©ã®ããã«èŠããããç¹å®ã®ã¢ãããŒãã«åºæã®æ©èœããããã®éã§å ±éããæ©èœãªã©ã§ãã
泚ïŒã¬ããŒãã®å ã®ãã¬ãŒã³ããŒã·ã§ã³ã§ãšã©ãŒãšã¿ã€ããã¹ãèŠã€ãã£ãããããã®èšäºã§ã¯ã Googleã¹ã©ã€ããŸãã¯SlideShareã«ããæŽæ°ããã³ç·šéãããããŒãžã§ã³ã®ã¹ã©ã€ãã䜿çšããŸã ã
裞ã®ãã«ãã¹ã¬ããã¯æªã§ãïŒ
ç¹°ãè¿ãã®ãããªãã£ããå§ããå¿ èŠããããŸãããããã§ãäŸç¶ãšããŠé¢é£æ§ããããŸãã
ãã¢ã¹ã¬ããããã¥ãŒããã¯ã¹ãæ¡ä»¶å€æ°ã䜿çšãããã«ãã¹ã¬ããC ++ããã°ã©ãã³ã°ã¯ã æ± ã çã¿ ã è¡ã§ãã
Habréã®ãã®èšäºã®æè¿ã®è¯ãäŸã¯ãã Tacticoolã¢ãã€ã«ãªã³ã©ã€ã³ã·ã¥ãŒãã£ã³ã°ã²ãŒã ã®ã¡ã¿ãµãŒããŒã®ã¢ãŒããã¯ã㣠ã ã§ãã ãã®äžã§ã圌ãã¯ã©ããã£ãŠã©ããã£ãŠCãC ++ã§ã®ãã«ãã¹ã¬ããã³ãŒãã®éçºã«é¢é£ããããããçš®é¡ã®ã¬ãŒããåéãããã«ã€ããŠè©±ããŸããã 競åã®çµæãšããŠãã¡ã¢ãªãã¹ããçºçãã䞊ååã«å€±æããããçç£æ§ãäœäžããŸããã
ãã®çµæããã¹ãŠãèªç¶ã«çµäºããŸããã
æãéèŠãªãã°ã®æ€çŽ¢ãšä¿®æ£ã«æ°é±éãè²»ãããåŸãçŸåšã®ãœãªã¥ãŒã·ã§ã³ã®ãã¹ãŠã®æ¬ ç¹ãä¿®æ£ãããããã ãã¹ãŠããŒãããæžãçŽãæ¹ãç°¡åã§ãããšå€æããŸããã
ãµãŒããŒã®æåã®ããŒãžã§ã³ã§äœæ¥ããŠãããšãã«C / C ++ãé£ã¹ãå¥ã®èšèªã§ãµãŒããŒãæžãçŽããŸããã
çŸå®ã®äžçã§ã¯ãå± å¿å°ã®è¯ãC ++ã³ãã¥ããã£ã®å€ã§ãéçºè ã¯C ++ã®äœ¿çšãäŸç¶ãšããŠé©åã§æ£åœåãããŠããå Žåã§ãC ++ã®äœ¿çšãæåŠããæ¹æ³ã®åªãããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã§ãã
ãããããªãã§ããïŒ
ãããããªããC ++ã§ã®ãããåºãã®ãã«ãã¹ã¬ããããæªã§ãããšç¹°ãè¿ãèšãããå Žåã人ã ã¯ããè¯ââãã¢ããªã±ãŒã·ã§ã³ã«å€ããå¿èåã§ããã䜿ãç¶ããŸããïŒ è²¬ä»»ã®æåšïŒ
- ç¡ç¥ïŒ
- æ ïŒ
- NIHçå矀ïŒ
çµå±ã®ãšãããæéãšå€ãã®ãããžã§ã¯ãã§ãã¹ãããã1ã€ã®ã¢ãããŒããšã¯ã»ã©é ããã®ã§ãã ç¹ã«ïŒ
- 俳åª
- éä¿¡é 次ããã»ã¹ïŒCSPïŒ
- ã¿ã¹ã¯ïŒéåæãçŽæãå ç©ãªã©ïŒ
- ããŒã¿ãããŒ
- ãªã¢ã¯ãã£ãããã°ã©ãã³ã°
- ...
äž»ãªçç±ã¯äŸç¶ãšããŠç¡ç¥ã§ããããšãæãŸããŸãã ããã倧åŠã§æããããããšã¯ãŸããããŸããã å°éè·ã«å°±ãè¥ãå°é家ã¯ã圌ãããã§ã«ç¥ã£ãŠããããšãã»ãšãã©äœ¿ã£ãŠããŸããã ãããŠããã®åŸãã¬ããžããŒã¹ãè£å ãããªãå Žåã人ã ã¯ãã¢ã¹ã¬ããããã¥ãŒããã¯ã¹ãcondition_variablesã䜿ãç¶ããŸãã
ä»æ¥ã¯ããã®ãªã¹ãã®æåã®3ã€ã®ã¢ãããŒãã«ã€ããŠèª¬æããŸãã ãããŠãæœè±¡çã«ã§ã¯ãªãã1ã€ã®ç°¡åãªã¿ã¹ã¯ã®äŸãšããŠè©±ããŸãããã ãã®åé¡ã解決ããã³ãŒãããã¢ã¯ã¿ãŒãCSPããã»ã¹ããã£ãã«ãããã³ã¿ã¹ã¯ã䜿çšããŠã©ã®ããã«èŠãããã瀺ããŠã¿ãŸãããã
å®éšãžã®ææŠ
次ã®HTTPãµãŒããŒãå®è£ ããå¿ èŠããããŸãã
- èŠæ±ïŒç»åIDããŠãŒã¶ãŒIDïŒãåãå ¥ããŸãã
- ãã®ãŠãŒã¶ãŒã«åºæã®ãéããããä»ããåçãæäŸããŸãã
ããšãã°ããã®ãããªãµãŒããŒã¯ããµãã¹ã¯ãªãã·ã§ã³ã«ãã£ãŠã³ã³ãã³ããé ä¿¡ããææãµãŒãã¹ã§å¿ èŠã«ãªãå ŽåããããŸãã ãã®ãµãŒãã¹ã®åçãã©ããã§ããããã¢ãããããå Žåããã®äžã®ãéãããã«ãã£ãŠã誰ããé žçŽ ããããã¯ãããå¿ èŠãããããç解ããããšãå¯èœã«ãªããŸãã
ã¿ã¹ã¯ã¯æœè±¡çã§ããããã¢ãããžã§ã¯ãShrimpã®åœ±é¿äžã§ãã®ã¬ããŒãã®ããã«ç¹å¥ã«çå®ãããŸããïŒãã§ã«èª¬æããŸããïŒ No. 1 ã Noã2 ã Noã3 ïŒã
ãã®HTTPãµãŒããŒã¯æ¬¡ã®ããã«æ©èœããŸãã
ã¯ã©ã€ã¢ã³ããããªã¯ãšã¹ããåä¿¡ããåŸã2ã€ã®å€éšãµãŒãã¹ã䜿çšããŸãã
- æåã¯ãŠãŒã¶ãŒã«é¢ããæ å ±ãè¿ããŸãã ãããããéããããå«ãç»åãååŸããŸãã
- 2çªç®ã¯å ã®ç»åãè¿ããŸã
ãããã®ãµãŒãã¹ã¯äž¡æ¹ãšãç¬ç«ããŠæ©èœããäž¡æ¹ã«åæã«ã¢ã¯ã»ã¹ã§ããŸãã
èŠæ±ã®åŠçã¯äºãã«ç¬ç«ããŠè¡ãããšãã§ããåäžã®èŠæ±ãåŠçãããšãã®ããã€ãã®ã¢ã¯ã·ã§ã³ã§ãã䞊è¡ããŠè¡ãããšãã§ããããã競äºåã®äœ¿çšã¯ããèªäœã瀺åããŠããŸãã é ã«æµ®ãã¶æãç°¡åãªããšã¯ãçä¿¡èŠæ±ããšã«åå¥ã®ã¹ã¬ãããäœæããããšã§ãã
ããããone-request = one-workflowã¢ãã«ã¯é«äŸ¡ãããŠãããŸãã¹ã±ãŒã«ããŸããã ããã¯å¿ èŠãããŸããã
ã¯ãŒã¯ãããŒã®æ°ã«ç¡é§ã«è¿ã¥ããŠããå°æ°ã®ã¯ãŒã¯ãããŒãå¿ èŠã§ãã
ããã§ã¯ãçä¿¡HTTPãªã¯ãšã¹ããåä¿¡ããããã®åå¥ã®ã¹ããªãŒã ãç¬èªã®çºä¿¡HTTPãªã¯ãšã¹ãã®ããã®åå¥ã®ã¹ããªãŒã ãåä¿¡ããHTTPãªã¯ãšã¹ãã®åŠçã調æŽããããã®åå¥ã®ã¹ããªãŒã ãå¿ èŠã§ãã ç»åã®æäœãå®è¡ããããã®ã¯ãŒã¯ãããŒã®ããŒã«ãšåæ§ã«ïŒç»åã®æäœã¯éåžžã«äžŠåã§ãããããè€æ°ã®ã¹ããªãŒã ã§åæã«ç»åãåŠçãããšãåŠçæéãççž®ãããŸãïŒã
ãããã£ãŠãç§ãã¡ã®ç®æšã¯ãå°æ°ã®ã¯ãŒã¯ã¹ã¬ããã§å€æ°ã®åæçä¿¡èŠæ±ãåŠçããããšã§ãã ããŸããŸãªã¢ãããŒãã§ãããéæããæ¹æ³ãèŠãŠã¿ãŸãããã
ããã€ãã®éèŠãªå 責äºé
ã¡ã€ã³ã¹ããŒãªãŒã«é²ã¿ãã³ãŒãäŸã解æããåã«ãããã€ãã®ã¡ã¢ãäœæããå¿ èŠããããŸãã
ãŸãã次ã®äŸã¯ãã¹ãŠç¹å®ã®ãã¬ãŒã ã¯ãŒã¯ãŸãã¯ã©ã€ãã©ãªã«é¢é£ä»ããããŠããŸããã APIåŒã³åºãåã®äžèŽã¯ãã©ã³ãã ã§æå³çã§ã¯ãããŸããã
第äºã«ã以äžã®äŸã«ã¯ãšã©ãŒåŠçããããŸããã ããã¯ãã¹ã©ã€ããã³ã³ãã¯ãã§èŠããããã«æå³çã«è¡ãããŸãã ãŸããã¬ããŒãã«å²ãåœãŠãããæéã«ææãé©åããããã«ããŸãã
第äžã«ããã®äŸã§ã¯ãããã°ã©ã ã®å éšã«ä»ã«äœãååšãããã«ã€ããŠã®æ å ±ãå«ããšã³ãã£ãã£execution_contextã䜿çšããŠããŸãã ãã®ãšã³ãã£ãã£ã®å ¥åã¯ãã¢ãããŒãã«äŸåããŸãã ã¢ã¯ã¿ãŒã®å Žåãexecution_contextã«ã¯ä»ã®ã¢ã¯ã¿ãŒãžã®ãªã³ã¯ããããŸãã CSPã®å Žåãexecution_contextã«ã¯ãä»ã®CSPããã»ã¹ãšã®éä¿¡çšã®CSPãã£ãã«ããããŸãã ç
ã¢ãããŒãïŒ1ïŒã¢ã¯ã¿ãŒ
ç°¡åãªã¢ã¯ã¿ãŒã¢ãã«
ã¢ã¯ã¿ãŒã¢ãã«ã䜿çšããå Žåããœãªã¥ãŒã·ã§ã³ã¯åå¥ã®ãªããžã§ã¯ãã¢ã¯ã¿ãŒã§æ§ç¯ãããåã¢ã¯ã¿ãŒã¯ç¬èªã®ãã©ã€ããŒãç¶æ ãæã¡ããã®ç¶æ ã¯ã¢ã¯ã¿ãŒèªèº«ä»¥å€ã®èª°ãã¢ã¯ã»ã¹ã§ããŸããã
ã¢ã¯ã¿ãŒã¯ãéåæã¡ãã»ãŒãžãä»ããŠäºãã«å¯Ÿè©±ããŸãã åã¢ã¯ã¿ãŒã«ã¯ç¬èªã®ã¡ãŒã«ããã¯ã¹ïŒã¡ãã»ãŒãžãã¥ãŒïŒããããããã«ã¢ã¯ã¿ãŒã«éä¿¡ãããã¡ãã»ãŒãžãä¿åããããã®åŸã®åŠçã®ããã«ããããååŸãããŸãã
ã¢ã¯ã¿ãŒã¯éåžžã«åçŽãªååã«åºã¥ããŠåäœããŸãã
- ã¢ã¯ã¿ãŒã¯æ¯ãèããæã€ãšã³ãã£ãã£ã§ãã
- ã¢ã¯ã¿ãŒã¯çä¿¡ã¡ãã»ãŒãžã«å¿çããŸãã
- ã¡ãã»ãŒãžãåä¿¡ãããšãã¢ã¯ã¿ãŒã¯æ¬¡ã®ããšãã§ããŸãã
- ããã€ãã®ïŒæçµçãªïŒæ°ã®ã¡ãã»ãŒãžãä»ã®ã¢ã¯ã¿ãŒã«éä¿¡ããŸãã
- ïŒæçµçãªïŒæ°ã®æ°ããã¢ã¯ã¿ãŒãäœæããŸãã
- åŸç¶ã®ã¡ãã»ãŒãžãåŠçããããã®æ°ããåäœãå®çŸ©ããŸãã
ã¢ããªã±ãŒã·ã§ã³å ã§ãã¢ã¯ã¿ãŒã¯ããŸããŸãªæ¹æ³ã§å®è£ ã§ããŸãã
- åã¢ã¯ã¿ãŒã¯ãåå¥ã®OSã¹ããªãŒã ãšããŠè¡šãããšãã§ããŸãïŒããã¯ãããšãã°ãC :: Just :: Thread Pro Actor Editionã©ã€ãã©ãªã§çºçããŸãïŒã
- åã¢ã¯ã¿ãŒã¯ãã¹ã¿ãã¯ãã«ã³ã«ãŒãã³ãšããŠè¡šãããšãã§ããŸãã
- åã¢ã¯ã¿ãŒã¯ã誰ããã³ãŒã«ããã¯ã¡ãœãããåŒã³åºããªããžã§ã¯ããšããŠè¡šãããšãã§ããŸãã
ãã®æ±ºå®ã§ã¯ãã³ãŒã«ããã¯ãæã€ãªããžã§ã¯ãã®åœ¢ã§ã¢ã¯ã¿ãŒã䜿çšããCSPã¢ãããŒãã®ã³ã«ãŒãã³ãæ®ããŸãã
ã¢ã¯ã¿ãŒã®ã¢ãã«ã«åºã¥ã決å®ã¹ããŒã
ã¢ã¯ã¿ãŒã«åºã¥ããŠãåé¡ã解決ããããã®äžè¬çãªã¹ããŒã ã¯æ¬¡ã®ããã«ãªããŸãã
HTTPãµãŒããŒã®éå§æã«äœæãããHTTPãµãŒããŒãåäœããŠããéã¯åžžã«ååšããã¢ã¯ã¿ãŒããããŸãã ãããã¯ãHttpSrvãUserCheckerãImageDownloaderãImageMixerãªã©ã®ã¢ã¯ã¿ãŒã§ãã
æ°ããçä¿¡HTTPèŠæ±ãåä¿¡ãããšãRequestHandlerã¢ã¯ã¿ãŒã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããŸããããã¯ãçä¿¡HTTPèŠæ±ãžã®å¿çãçºè¡ããåŸã«ç Žæ£ãããŸãã
RequestHandlerã¢ã¯ã¿ãŒã³ãŒã
çä¿¡HTTPèŠæ±ã®åŠçã調æŽããrequest_handlerã¢ã¯ã¿ãŒã®å®è£ ã¯ã次ã®ããã«ãªããŸãã
class request_handler final : public some_basic_type { const execution_context context_; const request request_; optional<user_info> user_info_; optional<image_loaded> image_; void on_start(); void on_user_info(user_info info); void on_image_loaded(image_loaded image); void on_mixed_image(mixed_image image); void send_mix_images_request(); ... // . }; void request_handler::on_start() { send(context_.user_checker(), check_user{request_.user_id(), self()}); send(context_.image_downloader(), download_image{request_.image_id(), self()}); } void request_handler::on_user_info(user_info info) { user_info_ = std::move(info); if(image_) send_mix_images_request(); } void request_handler::on_image_loaded(image_loaded image) { image_ = std::move(image); if(user_info_) send_mix_images_request(); } void request_handler::send_mix_images_request() { send(context_.image_mixer(), mix_images{user_info->watermark_image(), *image_, self()}); } void request_handler::on_mixed_image(mixed_image image) { send(context_.http_srv(), reply{..., std::move(image), ...}); }
ãã®ã³ãŒãã解æããŸãããã
ãªã¯ãšã¹ããåŠçããããã«å¿ èŠãªãã®ãä¿åããããŸãã¯ä¿åããå±æ§ã«ã¯ã©ã¹ããããŸãã ãŸãããã®ã¯ã©ã¹ã«ã¯ãäžåºŠã«åŒã³åºãããã³ãŒã«ããã¯ã®ã»ããããããŸãã
æåã«ãã¢ã¯ã¿ãŒãäœæãããçŽåŸã«ãon_startïŒïŒã³ãŒã«ããã¯ãåŒã³åºãããŸãã ãã®äžã§ã2ã€ã®ã¡ãã»ãŒãžãä»ã®ã¢ã¯ã¿ãŒã«éä¿¡ããŸãã ãŸããããã¯ã¯ã©ã€ã¢ã³ãIDã確èªããããã®check_userã¡ãã»ãŒãžã§ãã 次ã«ãããã¯å ã®ã€ã¡ãŒãžãããŠã³ããŒãããããã®download_imageã¡ãã»ãŒãžã§ãã
éä¿¡ãããåã¡ãã»ãŒãžã§ã¯ãèªåèªèº«ãžã®ãªã³ã¯ãæž¡ããŸãïŒselfïŒïŒã¡ãœããã®åŒã³åºãã¯ãselfïŒïŒãåŒã³åºãããã¢ã¯ã¿ãŒãžã®ãªã³ã¯ãè¿ããŸãïŒã ããã¯ãã¢ã¯ã¿ãŒãå¿çã§ã¡ãã»ãŒãžãéä¿¡ã§ããããã«ããããã«å¿ èŠã§ãã check_userã¡ãã»ãŒãžãªã©ã§ã¢ã¯ã¿ãŒãžã®ãªã³ã¯ãéä¿¡ããªãå ŽåãUserCheckerã¢ã¯ã¿ãŒã¯ãŠãŒã¶ãŒæ å ±ã®éä¿¡å ãç¥ãããšãã§ããŸããã
ãŠãŒã¶ãŒæ å ±ãå«ãuser_infoã¡ãã»ãŒãžãå¿çãšããŠéä¿¡ããããšãon_user_infoïŒïŒã³ãŒã«ããã¯ãåŒã³åºãããŸãã ãããŠãimage_loadedã¡ãã»ãŒãžãéä¿¡ããããšãã¢ã¯ã¿ãŒã¯on_image_loadedïŒïŒã³ãŒã«ããã¯ãåŒã³åºããŸãã ãããŠä»ããããã®2ã€ã®ã³ãŒã«ããã¯å ã«ã¯ãã¢ã¯ã¿ãŒã®ã¢ãã«ã«åºæã®æ©èœããããŸããå¿çã¡ãã»ãŒãžãåä¿¡ããé åºãæ£ç¢ºã«ç¥ããŸããã ãããã£ãŠãã¡ãã»ãŒãžãå°çããé åºã«äŸåããªãããã«ã³ãŒããäœæããå¿ èŠããããŸãã ãããã£ãŠãåãã³ãã©ãŒã§ã¯ãåä¿¡ããæ å ±ã察å¿ããå±æ§ã«æåã«æ ŒçŽãã次ã«å¿ èŠãªæ å ±ããã¹ãŠåéããŠãããã©ããã確èªããŸãã ãããããªãã次ã«é²ãããšãã§ããŸãã ããã§ãªãå Žåã¯ãããã«åŸ æ©ããŸãã
ãã®ãããsend_mix_images_requestïŒïŒãåŒã³åºãããonsãon_user_infoïŒïŒããã³on_image_loadedïŒïŒifsã«ããã®ã¯ãã®ããã§ãã
ååãšããŠãã¢ã¯ã¿ãŒã®ã¢ãã«ã®å®è£ ã«ã¯ãErlangããã®éžæçåä¿¡ãAkkaããã®ã¹ã¿ãã·ã³ã°ãªã©ã®ã¡ã«ããºã ããããŸãããããã®ã¡ã«ããºã ã䜿çšããŠãçä¿¡ã¡ãã»ãŒãžã®åŠçé åºãæäœã§ããŸãããã¢ãã«ã®ããŸããŸãªå®è£ ã®è©³çŽ°ã®å€§éšåãæãäžããªãããã«ãä»æ¥ã¯ããã«ã€ããŠã¯èª¬æããŸãã俳åªã
ãã®ãããUserCheckerããã³ImageDownloaderããå¿ èŠãªãã¹ãŠã®æ å ±ãåä¿¡ãããšãsend_mix_images_requestïŒïŒã¡ãœãããåŒã³åºãããmix_imagesã¡ãã»ãŒãžãImageMixerã¢ã¯ã¿ãŒã«éä¿¡ãããŸãã çµæã®ç»åãå«ãå¿çã¡ãã»ãŒãžãåä¿¡ãããšãon_mixed_imageïŒïŒã³ãŒã«ããã¯ãåŒã³åºãããŸãã ããã§ã¯ããã®ã€ã¡ãŒãžãHttpSrvã¢ã¯ã¿ãŒã«éä¿¡ããHttpSrvãHTTPå¿çã圢æããäžèŠã«ãªã£ãRequestHandlerãç Žæ£ãããŸã§åŸ æ©ããŸãïŒãã ããååãšããŠãRequestHandlerã¢ã¯ã¿ãŒãon_mixed_imageïŒïŒã³ãŒã«ããã¯ã§èªå·±ç Žå£ããã®ãé²ããã®ã¯ãããŸããïŒã
ããã ãã§ãã
RequestHandlerã¢ã¯ã¿ãŒã®å®è£ ã¯ããªãèšå€§ãªãã®ã§ããããšãå€æããŸããã ããããããã¯å±æ§ãšã³ãŒã«ããã¯ã䜿çšããŠã¯ã©ã¹ãèšè¿°ããããã«ã³ãŒã«ããã¯ãå®è£ ããå¿ èŠããããšããäºå®ã«ãããã®ã§ãã ããããRequestHandlerã®åäœã®ããžãã¯ã¯éåžžã«ç°¡åã§ãããrequest_handlerã¯ã©ã¹ã®ã³ãŒãã®éã«ããããããããããç解ããããšã¯é£ãããããŸããã
ã¢ã¯ã¿ãŒã«åºæã®æ©èœ
ããã§ãActorsã®Modelã®æ©èœã«ã€ããŠå°ãèªãããšãã§ããŸãã
ååç
ååãšããŠãã¢ã¯ã¿ãŒã¯çä¿¡ã¡ãã»ãŒãžã«ã®ã¿å¿çããŸãã ã¡ãã»ãŒãžããããŸã-ã¢ã¯ã¿ãŒã¯ããããåŠçããŸãã ã¡ãã»ãŒãžãªã-ã¢ã¯ã¿ãŒã¯äœãããŸããã
ããã¯ãã¢ã¯ã¿ãŒãã³ãŒã«ããã¯ãæã€ãªããžã§ã¯ããšããŠè¡šãããã¢ã¯ã¿ãŒã®ã¢ãã«ã®å®è£ ã«ç¹ã«åœãŠã¯ãŸããŸãã ãã¬ãŒã ã¯ãŒã¯ã¯ã¢ã¯ã¿ãŒã®ã³ãŒã«ããã¯ããã«ããã¢ã¯ã¿ãŒãã³ãŒã«ããã¯ããå¶åŸ¡ãè¿ããªãå Žåããã¬ãŒã ã¯ãŒã¯ã¯åãã³ã³ããã¹ãå ã®ä»ã®ã¢ã¯ã¿ãŒã«ãµãŒãã¹ãæäŸã§ããŸããã
ã¢ã¯ã¿ãŒã¯éè² è·ã§ã
ã¢ã¯ã¿ãŒã§ã¯ãã¢ã¯ã¿ãŒãããã¥ãŒãµãŒãã¢ã¯ã¿ãŒã³ã³ã·ã¥ãŒããŒåãã®ã¡ãã»ãŒãžããã¢ã¯ã¿ãŒã³ã³ã·ã¥ãŒããŒãåŠçã§ãããããã¯ããã«éãããŒã¹ã§éåžžã«ç°¡åã«çæã§ããŸãã
ããã«ãããã¢ã¯ã¿ãŒ-ã³ã³ã·ã¥ãŒããŒã®çä¿¡ã¡ãã»ãŒãžã®ãã¥ãŒãåžžã«å¢å ãããšããäºå®ã«ã€ãªãããŸãã ãã¥ãŒã®æé·ãã€ãŸã ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªæ¶è²»ãå¢å ãããšãã¢ããªã±ãŒã·ã§ã³ã®é床ãäœäžããŸãã ããã«ããããã¥ãŒã®æé·ãããã«éããªãããã®çµæãã¢ããªã±ãŒã·ã§ã³ãå®å šã«æ©èœããªããªãå¯èœæ§ããããŸãã
ããã¯ãã¹ãŠãã¢ã¯ã¿ãŒã®éåæçžäºäœçšã®çŽæ¥çãªçµæã§ãã éåžžãéä¿¡æäœã¯éããããã³ã°ã§ãã ãããŠããããã¯ããã®ã¯ç°¡åã§ã¯ãããŸããããªããªã 俳åªã¯èªåèªèº«ã«éãããšãã§ããŸãã ãããŠãã¢ã¯ã¿ãŒã®ãã¥ãŒããã£ã±ãã®å Žåãèªåã«éä¿¡ãããšã¢ã¯ã¿ãŒããããã¯ãããããã«ãã圌ã®äœæ¥ãåæ¢ããŸãã
ãã®ããã俳åªãšååããå Žåãéè² è·ã®åé¡ã«çå£ã«æ³šæãæãå¿ èŠããããŸãã
å€ãã®ä¿³åªãåžžã«è§£æ±ºçãšã¯éããŸããã
ååãšããŠãã¢ã¯ã¿ãŒã¯è»œéã®ãšã³ãã£ãã£ã§ãããã¢ããªã±ãŒã·ã§ã³ã§å€§éã«äœæããèªæããããŸãã 1äžäººã®ä¿³åªã10äžäººã100äžäººã®ä¿³åªãäœæã§ããŸãã ãããŠéãããªããèš±ãã°ã1å人ã®ä¿³åªã§ããã
ãããåé¡ã¯ãéåžžã«å€æ°ã®ã¢ã¯ã¿ãŒã®åäœã远跡ããã®ãé£ããããšã§ãã ã€ãŸã æ確ã«æ£ããæ©èœãã俳åªããããããããŸããã æããã«æ£ããåäœããªããããŸã£ããåäœããªã俳åªãããŸãããããã«ã€ããŠã¯ç¢ºå®ã«ç¥ã£ãŠããŸãã ããããããªããäœãç¥ããªãã¢ã¯ã¿ãŒãããããããå¯èœæ§ããããŸãã圌ãã¯ãŸã£ããåããŠããã®ããæ£ããåããŠããã®ããééã£ãŠããã®ãã ãªããªããããã°ã©ã å ã«ç¬èªã®åäœããžãã¯ãæã€1åã®èªåŸãšã³ãã£ãã£ãããå Žåããããç£èŠããããšã¯èª°ã«ãšã£ãŠãéåžžã«é£ããããã§ãã
ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã§å€æ°ã®ã¢ã¯ã¿ãŒãäœæããå Žåãé©çšãããåé¡ã解決ããã®ã§ã¯ãªããå¥ã®åé¡ãçºçããããšãå€æããå ŽåããããŸãã ãããã£ãŠãè€æ°ã®ã¿ã¹ã¯ãå®è¡ããããè€éã§éãã¢ã¯ã¿ãŒãæ¯æããŠãåäžã®ã¿ã¹ã¯ã解決ããåçŽãªã¢ã¯ã¿ãŒãæŸæ£ããããšãæçãªå ŽåããããŸãã ããããã¢ããªã±ãŒã·ã§ã³ã«ã¯ãã®ãããªãéããã¢ã¯ã¿ãŒãå°ãªããªãããããã«åŸãã®ãç°¡åã«ãªããŸãã
ã©ããèŠãŠãäœããã¹ããïŒ
誰ããC ++ã§ã¢ã¯ã¿ãŒãæäœãããå Žåãç¬èªã®ãã€ã¯ãäœæããŠãæå³ããããŸãããç¹ã«ããã€ãã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ããããŸãã
- SObjectizer ïŒåœå ã¡ãŒã«ãŒããµããŒãïŒïŒ
- C ++ã¢ã¯ã¿ãŒãã¬ãŒã ã¯ãŒã¯ïŒCAFïŒ
- QP / C ++
ãããã®3ã€ã®ãªãã·ã§ã³ã¯ã掻çºã§ãé²åããã¯ãã¹ãã©ãããã©ãŒã ã§ãææžåãããŠããŸãã ç¡æã§è©Šãããšãã§ããŸãã ããã«ãWikipediaã®ãªã¹ãã«ã¯ãæ°é®®åºŠãç°ãªã[ã§ã¯ãªã]ããã€ãã®ãªãã·ã§ã³ããããŸãã
SObjectizerãšCAFã¯ãäŸå€ãšåçã¡ã¢ãªãé©çšã§ããããªãé«ã¬ãã«ã®ã¿ã¹ã¯ã§äœ¿çšããããã«èšèšãããŠããŸãã ãããŠãQP / C ++ãã¬ãŒã ã¯ãŒã¯ã¯ãçµã¿èŸŒã¿éçºã«é¢äžãã人ã ã«ãšã£ãŠèå³æ·±ããããããŸããã 圌ããæçããããã®ã¯ããã®ãããã®äžã§ãã
ã¢ãããŒãïŒ2ïŒCSPïŒé 次ããã»ã¹ã®éä¿¡ïŒ
æã«ãã¿ã³ãªãã®CSP
CSPã¢ãã«ã¯ãã¢ã¯ã¿ãŒã¢ãã«ã«éåžžã«äŒŒãŠããŸãã ãŸããèªåŸãšã³ãã£ãã£ã®ã»ãããããœãªã¥ãŒã·ã§ã³ãæ§ç¯ããŸããåãšã³ãã£ãã£ã¯ç¬èªã®ãã©ã€ããŒãç¶æ ãæã¡ãéåæã¡ãã»ãŒãžãä»ããŠã®ã¿ä»ã®ãšã³ãã£ãã£ãšå¯Ÿè©±ããŸãã
CSPã¢ãã«å ã®ãããã®ãšã³ãã£ãã£ã®ã¿ããããã»ã¹ããšåŒã°ããŸãã
CSPã®ããã»ã¹ã¯è»œéã§ãããå éšã®äœæ¥ã䞊ååããå¿ èŠã¯ãããŸããã äœãã䞊ååããå¿ èŠãããå Žåã¯ãããã€ãã®CSPããã»ã¹ãéå§ããã ãã§ããã®å éšã«ã¯ãã䞊ååã¯ãããŸããã
CSPããã»ã¹ã¯éåæã¡ãã»ãŒãžãä»ããŠçžäºäœçšããŸãããã¡ãã»ãŒãžã¯ã¢ã¯ã¿ãŒã®ã¢ãã«ã®ããã«ã¡ãŒã«ããã¯ã¹ã§ã¯ãªãããã£ãã«ã«éä¿¡ãããŸãã ãã£ãã«ã¯ãéåžžã¯åºå®ãµã€ãºã®ã¡ãã»ãŒãžãã¥ãŒãšèããããšãã§ããŸãã
ã¡ãŒã«ããã¯ã¹ãåã¢ã¯ã¿ãŒã«å¯ŸããŠèªåçã«äœæãããã¢ã¯ã¿ãŒã¢ãã«ãšã¯ç°ãªããCSPã®ãã£ãã«ã¯æ瀺çã«äœæããå¿ èŠããããŸãã ãããŠã2ã€ã®ããã»ã¹ãçžäºã«ããåãããå¿ èŠãããå Žåãèªåã§ãã£ãã«ãäœæããæåã®ããã»ã¹ã«ãããã«æžãããšäŒãã2çªç®ã®ããã»ã¹ã«ãããããèªã¿ãŸãããšèšãå¿ èŠããããŸãã
åæã«ããã£ãã«ã«ã¯å°ãªããšã2ã€ã®æäœããããæ瀺çã«åŒã³åºãå¿ èŠããããŸãã 1ã€ç®ã¯ããã£ãã«ã«ã¡ãã»ãŒãžãæžã蟌ãæžã蟌ã¿ïŒéä¿¡ïŒæäœã§ãã
次ã«ããã£ãã«ããã¡ãã»ãŒãžãèªã¿åãããã®èªã¿åãïŒåä¿¡ïŒæäœã§ãã ãŸããæ瀺çã«read / receiveãåŒã³åºãå¿ èŠããããããCSPã¯ã¢ã¯ã¿ãŒã¢ãã«ãšåºå¥ãããŸãã ã¢ã¯ã¿ãŒã®å Žåãéåžžãèªã¿åã/åä¿¡æäœã¯ã¢ã¯ã¿ãŒããé ãããŸãã ã€ãŸã ã¢ã¯ã¿ãŒãã¬ãŒã ã¯ãŒã¯ã¯ãã¢ã¯ã¿ãŒãã¥ãŒããã¡ãã»ãŒãžãååŸããååŸããã¡ãã»ãŒãžã®ãã³ãã©ãŒïŒã³ãŒã«ããã¯ïŒãåŒã³åºãããšãã§ããŸãã
CSPããã»ã¹èªäœãèªã¿åã/åä¿¡åŒã³åºãã®ã¿ã€ãã³ã°ãéžæããå¿ èŠããããŸãããCSPããã»ã¹ã¯åä¿¡ããã¡ãã»ãŒãžãå€å¥ããæœåºããã¡ãã»ãŒãžãåŠçããå¿ èŠããããŸãã
ã倧ãã¢ããªã±ãŒã·ã§ã³å ã§ãCSPããã»ã¹ã¯ããŸããŸãªæ¹æ³ã§å®è£ ã§ããŸãã
- CSP-shnyããã»ã¹ã¯ãåå¥ã®ã¹ã¬ããOSãšããŠå®è£ ã§ããŸãã è²»çšã®ããããœãªã¥ãŒã·ã§ã³ã§ãããããªãšã³ããã£ããªãã«ãã¿ã¹ã¯ã䜿çšããŠããŸãã
- CSPããã»ã¹ã¯ãã³ã«ãŒãã³ïŒã¹ã¿ãã¯ãã«ã³ã«ãŒãã³ããã¡ã€ããŒãã°ãªãŒã³ã¹ã¬ãããªã©ïŒã«ãã£ãŠå®è£ ã§ããŸãã ã¯ããã«å®äŸ¡ã§ããããã«ãã¿ã¹ã¯ã¯å調çã§ãã
ããã«ãCSPããã»ã¹ã¯ã¹ã¿ãã¯ãã«ã³ã«ãŒãã³ã®åœ¢åŒã§æ瀺ããããšæ³å®ããŠããŸãïŒãã ãã以äžã«ç€ºãã³ãŒãã¯OSã¹ã¬ããã«å®è£ ããããšãã§ããŸãïŒã
CSPããŒã¹ã®ãœãªã¥ãŒã·ã§ã³å³
CSPã¢ãã«ã«åºã¥ããœãªã¥ãŒã·ã§ã³ã¹ããŒã ã¯ãã¢ã¯ã¿ãŒã¢ãã«ã®åæ§ã®ã¹ããŒã ã«éåžžã«äŒŒãŠããŸãïŒããã¯å¶ç¶ã§ã¯ãããŸããïŒã
HTTPãµãŒããŒã®éå§æã«éå§ãããåžžã«æ©èœãããšã³ãã£ãã£ããããŸãããããã¯ãHttpSrvãUserCheckerãImageDownloaderãImageMixerã®CSPããã»ã¹ã§ãã æ°ããçä¿¡èŠæ±ããšã«ãæ°ããCSP-shyããã»ã¹RequestHandlerãäœæãããŸãã ãã®ããã»ã¹ã¯ãã¢ã¯ã¿ãŒã¢ãã«ã䜿çšããå Žåãšåãã¡ãã»ãŒãžãéåä¿¡ããŸãã
RequestHandler CSPããã»ã¹ã³ãŒã
ããã¯ãRequestHandler CSPããã»ã¹ãå®è£ ããé¢æ°ã®ã³ãŒãã®ããã«èŠããå ŽåããããŸãã
void request_handler(const execution_context ctx, const request req) { auto user_info_ch = make_chain<user_info>(); auto image_loaded_ch = make_chain<image_loaded>(); ctx.user_checker_ch().write(check_user{req.user_id(), user_info_ch}); ctx.image_downloader_ch().write(download_image{req.image_id(), image_loaded_ch}); auto user = user_info_ch.read(); auto original_image = image_loaded_ch.read(); auto image_mix_ch = make_chain<mixed_image>(); ctx.image_mixer_ch().write( mix_image{user.watermark_image(), std::move(original_image), image_mix_ch}); auto result_image = image_mix_ch.read(); ctx.http_srv_ch().write(reply{..., std::move(result_image), ...}); }
ããã§ã¯ããã¹ãŠãéåžžã«ç°¡åã§ãããåããã¿ãŒã³ãå®æçã«ç¹°ãè¿ãããŸãã
- æåã«ãå¿çã¡ãã»ãŒãžãåä¿¡ããããã®ãã£ãã«ãäœæããŸãã ãããå¿ èŠãªçç±ã¯ CSPããã»ã¹ã«ã¯ãã¢ã¯ã¿ãŒã®ãããªç¬èªã®ããã©ã«ãã¡ãŒã«ããã¯ã¹ããããŸããã ãããã£ãŠãCSP-shnyããã»ã¹ãäœããåä¿¡ããå Žåããã®ãäœãããæžã蟌ãŸãããã£ãã«ãäœæããããšã§å°æããã¯ãã§ãã
- 次ã«ãCSPãã¹ã¿ãŒããã»ã¹ã«ã¡ãã»ãŒãžãéä¿¡ããŸãã ãã®ã¡ãã»ãŒãžã§ã¯ãå¿çã¡ãã»ãŒãžã®ãã£ãã«ã瀺ããŠããŸãã
- 次ã«ãå¿çã¡ãã»ãŒãžãéä¿¡ããå¿ èŠããããã£ãã«ããèªã¿åãæäœãå®è¡ããŸãã
ããã¯ãImageSPixer CSPããã»ã¹ãšã®éä¿¡ã®äŸã§éåžžã«æ確ã«èŠãããŸãã
auto image_mix_ch = make_chain<mixed_image>(); // . ctx.image_mixer_ch().write( // . mix_image{..., image_mix_ch}); // . auto result_image = image_mix_ch.read(); // .
ãã ãããã®ãã©ã°ã¡ã³ãã«æ³šç®ãã䟡å€ã¯ãããŸãã
auto user = user_info_ch.read(); auto original_image = image_loaded_ch.read();
ããã§ã¯ã俳åªã®ã¢ãã«ãšã¯å¥ã®å€§ããªéãããããŸãã CSPã®å Žåãé©åãªé åºã§å¿çã¡ãã»ãŒãžãåä¿¡ã§ããŸãã
æåã«user_infoãåŸ ã¡ããã§ããïŒ åé¡ãããŸãããuser_infoã衚瀺ããããŸã§èªã¿åãæã«ã¹ãªãŒãç¶æ ã«ãªããŸãã ãã®æéãŸã§ã«image_loadedããã§ã«éä¿¡ãããŠããå Žåããããèªã¿åããããŸã§ãã£ãã«ã§åŸ æ©ããŸãã
å®éãäžèšã®ã³ãŒãã«ä»éã§ããã®ã¯ããã ãã§ãã CSPããŒã¹ã®ã³ãŒãã¯ãã¢ã¯ã¿ãŒããŒã¹ã®ã³ãŒããããå°ãããªããŸããã é©ãããšã§ã¯ãããŸãã ããã§ã¯ãã³ãŒã«ããã¯ã¡ãœãããæã€å¥ã®ã¯ã©ã¹ãèšè¿°ããå¿ èŠã¯ãããŸããã§ããã ãããŠãCSPã·ã£ã€ããã»ã¹RequestHandlerã®ç¶æ ã®äžéšã¯ãåŒæ°ctxããã³reqã®åœ¢åŒã§æé»çã«ååšããŸãã
CSPæ©èœ
CSPããã»ã¹ã®åå¿æ§ãšããã¢ã¯ãã£ãæ§
ã¢ã¯ã¿ãŒãšã¯ç°ãªããCSPããã»ã¹ã¯ãªã¢ã¯ãã£ããããã¢ã¯ãã£ãããŸãã¯ãã®äž¡æ¹ã«ããããšãã§ããŸãã CSPããã»ã¹ãåä¿¡ã¡ãã»ãŒãžããã§ãã¯ãããšããŸã;ããããã°ããããåŠçããŸããã ãããŠãçä¿¡ã¡ãã»ãŒãžããªãã£ãããšãèŠãŠã圌ã¯è¡åãä¹ç®ããããšãçŽæããŸããã
ãã°ããããŠããããªãã¯ã¹ã®CSPããã»ã¹ã¯ä¹ç®ã«ãããããã圌ã¯åã³çä¿¡ã¡ãã»ãŒãžããã§ãã¯ããŸããã æ°ãããã®ã¯ãããŸãããïŒ ããŠãããŠãè¡åãããã«ä¹ç®ããŠã¿ãŸãããã
ãããŠãçä¿¡ã¡ãã»ãŒãžããªããŠãCSPããã»ã¹ãäœããã®äœæ¥ãè¡ããã®æ©èœã«ãããCSPã¢ãã«ã¯ã¢ã¯ã¿ãŒã¢ãã«ãšã¯å€§ããç°ãªããŸãã
ãã€ãã£ãã®éè² è·ä¿è·ã¡ã«ããºã
ååãšããŠããã£ãã«ã¯éããããµã€ãºã®ã¡ãã»ãŒãžã®ãã¥ãŒã§ããããã£ã±ãã«ãªã£ããã£ãã«ã«ã¡ãã»ãŒãžãæžã蟌ãããšãããšéä¿¡è ãåæ¢ãããããCSPã«ã¯éè² è·ã«å¯Ÿããä¿è·ã¡ã«ããºã ãçµã¿èŸŒãŸããŠããŸãã
å®éãã¹ããŒããããã¥ãŒãµãŒããã»ã¹ãšé ãã³ã³ã·ã¥ãŒãããã»ã¹ãããå Žåããããã¥ãŒãµãŒããã»ã¹ã¯ããã«ãã£ãã«ããã£ã±ãã«ãã次ã®éä¿¡æäœã®ããã«äžæãããŸãã ãããŠããããã¥ãŒãµãŒããã»ã¹ã¯ãã³ã³ã·ã¥ãŒãããã»ã¹ãæ°ããã¡ãã»ãŒãžã®ããã«ãã£ãã«å ã®ã¹ããŒã¹ã解æŸãããŸã§ã¹ãªãŒãããŸãã å Žæã衚瀺ããããšããã«ããããã¥ãŒãµãŒããã»ã¹ãèµ·åããæ°ããã¡ãã»ãŒãžããã£ãã«ã«ã¹ããŒããŸãã
ãããã£ãŠãCSPã䜿çšããå Žåãã¢ã¯ã¿ãŒã®ã¢ãã«ã®å Žåãããéè² è·ã®åé¡ã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããã 確ãã«ãããã«ã¯èœãšãç©ŽããããŸãããããã«ã€ããŠã¯å°ãåŸã§èª¬æããŸãã
CSPããã»ã¹ã®å®è£ æ¹æ³
CSPããã»ã¹ã®å®è£ æ¹æ³ã決å®ããå¿ èŠããããŸãã
åCSP-shnyããã»ã¹ãåå¥ã®OSã¹ã¬ããã§è¡šãããããã«ã§ããŸãã é«äŸ¡ã§ã¹ã±ãŒã©ãã«ã§ã¯ãªããœãªã¥ãŒã·ã§ã³ã§ããããšãããããŸããã ãããäžæ¹ã§ãããªãšã³ããã£ããã«ãã¿ã¹ã¯ãååŸããŸãïŒCSPããã»ã¹ãè¡åã®ä¹ç®ãéå§ããããäœããã®ããããã³ã°åŒã³åºããè¡ããšãOSã¯æçµçã«ãããèšç®ã³ã¢ããæŒãåºããä»ã®CSPããã»ã¹ãæ©èœããããã«ããŸãã
åCSPããã»ã¹ãã³ã«ãŒãã³ïŒã¹ã¿ãã¯ãã«ã³ã«ãŒãã³ïŒã§è¡šãããšãã§ããŸãã ããã¯ãã¯ããã«å®äŸ¡ã§ã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ã§ãã ãã ããããã§ã¯å調çãªãã«ãã¿ã¹ã¯ã®ã¿ãè¡ããŸãã ãããã£ãŠãçªç¶CSPããã»ã¹ãè¡åã®ä¹ç®ã䜿çšãããšããã®CSPããã»ã¹ãšããã«æ¥ç¶ãããŠããä»ã®CSPããã»ã¹ãæã€äœæ¥ã¹ã¬ããããããã¯ãããŸãã
å¥ã®ããªãã¯ããããããããŸããã ãµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšãããšããŸããããã®å éšã§ã¯åœ±é¿ãäžããããšã¯ã§ããŸããã ãŸããã©ã€ãã©ãªå ã§ã¯ãTLSå€æ°ã䜿çšãããŸãïŒã€ãŸããthread-local-storageïŒã ã©ã€ãã©ãªé¢æ°ã1ååŒã³åºããšãã©ã€ãã©ãªã¯TLSå€æ°ã®å€ãèšå®ããŸãã ãã®åŸãã³ã«ãŒãã³ã¯å¥ã®äœæ¥ã¹ã¬ããã«ã移åãããŸããããã¯å¯èœã§ãã ååãšããŠãã³ã«ãŒãã³ã¯1ã€ã®äœæ¥ã¹ã¬ããããå¥ã®ã¹ã¬ããã«ç§»è¡ã§ããŸãã ã©ã€ãã©ãªé¢æ°ã«å¯ŸããŠæ¬¡ã®åŒã³åºããè¡ããšãã©ã€ãã©ãªã¯TLSå€æ°ã®å€ãèªã¿åãããšããŸãã ãããããã§ã«å¥ã®æå³ããããããããŸããïŒ ãããŠããã®ãããªãã°ãæ¢ãããšã¯éåžžã«é£ããã§ãããã
ãããã£ãŠãCSPããã»ã¹ãå®è£ ããæ¹æ³ã®éžæãæ éã«æ€èšããå¿ èŠããããŸãã ãªãã·ã§ã³ã«ã¯ããããé·æãšçæããããŸãã
å€ãã®ããã»ã¹ãåžžã«è§£æ±ºçãšã¯éããŸããã
ã¢ã¯ã¿ãŒãšåæ§ã«ãããã°ã©ã ã«å€ãã®CSPããã»ã¹ãäœæããæ©èœã¯ãé©çšãããåé¡ã®è§£æ±ºçãšã¯éããŸããããèªåã§è¿œå ã®åé¡ãäœæããŸãã
ããã«ãããã°ã©ã å ã§çºçããŠããããšã®å¯èŠæ§ã®äœãã¯ãåé¡ã®äžéšã«ãããŸããã å¥ã®èœãšãç©Žã«çŠç¹ãåœãŠãããšæããŸãã
å®éãCSP-shnyhãã£ãã«ã§ã¯ããããããã¯ã¢ããã°ãç°¡åã«ååŸã§ããŸãã ããã»ã¹Aã¯ãã«ãã£ãã«C1ã«ã¡ãã»ãŒãžãæžã蟌ãããšããããã»ã¹Aã¯äžæåæ¢ããŸãã æºæ¯ã®ãã£ãã«C2ã«æžã蟌ãããšãããã£ãã«C1ããããã»ã¹Bãèªã¿åãå¿ èŠããããããããã»ã¹Bã¯äžæãããŸããã ããã»ã¹Aã¯ãã£ãã«C2ããèªã¿åãå¿ èŠããããŸããããã ãã§ããããããã¯ãçºçããŸããã
CSPããã»ã¹ã2ã€ãããªãå Žåããããã°äžãŸãã¯ã³ãŒãã¬ãã¥ãŒæé ã§ããã®ãããªãããããã¯ãèŠã€ããããšãã§ããŸãã ããããããã°ã©ã ã«æ°çŸäžã®ããã»ã¹ãããå Žåããããã¯äºãã«ã¢ã¯ãã£ãã«éä¿¡ãããã®ãããªãããããã¯ã®å¯èœæ§ã¯å€§å¹ ã«å¢å ããŸãã
ã©ããèŠãŠãäœããã¹ããïŒ
誰ããC ++ã§CSPã䜿çšãããå Žåãæ®å¿µãªããããã§ã®éžæã¯ã¢ã¯ã¿ãŒã»ã©å€§ããã¯ãããŸããã ããŠããŸãã¯ç§ã¯ã©ããèŠãŠãã©ã®ããã«èŠãããããããŸããã ãã®å Žåãã³ã¡ã³ããä»ã®ãªã³ã¯ãå ±æããããšãé¡ã£ãŠããŸãã
ãã ããCSPã䜿çšããå Žåã¯ããŸãBoost.Fiberã«æ³šç®ããå¿ èŠããããŸãã ãã¡ã€ããŒïŒã³ã«ãŒãã³ïŒããã£ãã«ãããã³mutexãcondition_variableãbarrierãªã©ã®äœã¬ãã«ããªããã£ãããããŸãã ããã¯ãã¹ãŠååŸããŠäœ¿çšã§ããŸãã
ã¹ã¬ãã圢åŒã®CSPããã»ã¹ã«æºè¶³ããŠããå Žåã¯ã SObjectizerãã芧ãã ãã ã CSPãã£ãã«ã®é¡äŒŒç©ããããSObjectizeräžã®è€éãªãã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã¯ãã¢ã¯ã¿ãŒãªãã§äœæã§ããŸãã
ã¢ã¯ã¿ãŒvs CSP
ã¢ã¯ã¿ãŒãšCSPã¯äºãã«éåžžã«äŒŒãŠããŸãã ç¹°ãè¿ããç§ã¯ããã2ã€ã®ã¢ãã«ãäºãã«åçã§ãããšããã¹ããŒãã¡ã³ãã«åºããããŸããã ã€ãŸã ã¢ã¯ã¿ãŒã§ã§ããããšã¯ãCSPããã»ã¹ã§ã»ãŒ1察1ã§ç¹°ãè¿ãããšãã§ãããã®éãåæ§ã§ãã 圌ãã¯ãããæ°åŠçã«èšŒæããããšããèšããŸãã ããããããã§ã¯äœãç解ã§ããªãã®ã§ãäœãèšããŸããã ããããæ¥åžžçãªåžžèã®ã¬ãã«ã®ã©ããã§ã®ç§èªèº«ã®èããããããã¯ãã¹ãŠãã£ãšããããããã«èŠããŸãã å®éãå Žåã«ãã£ãŠã¯ãã¢ã¯ã¿ãŒãCSPããã»ã¹ã«ãCSPããã»ã¹ãã¢ã¯ã¿ãŒã«çœ®ãæããããšãã§ããŸãã
ãã ããã¢ã¯ã¿ãŒãšCSPã«ã¯ããã€ãã®éããããããããã®ã¢ãã«ã®ãããããæçã§ãããäžå©ã§ããããå€æããã®ã«åœ¹ç«ã¡ãŸãã
ãã£ãã«ãšã¡ãŒã«ããã¯ã¹
ã¢ã¯ã¿ãŒã«ã¯ãåä¿¡ã¡ãã»ãŒãžãåä¿¡ããããã®åäžã®ããã£ãã«ãããããŸããããã¯ãåã¢ã¯ã¿ãŒã«å¯ŸããŠèªåçã«äœæããã圌ã®ã¡ãŒã«ããã¯ã¹ã§ãã ãããŠãã¢ã¯ã¿ãŒã¯ããããã¡ãã»ãŒãžããã¡ãã»ãŒãžãã¡ãŒã«ããã¯ã¹ã«ãã£ãé åºã§æ£ç¢ºã«ååŸããŸãã
ããã¯ããªãæ·±å»ãªè³ªåã§ãã ã¢ã¯ã¿ãŒã®ã¡ãŒã«ããã¯ã¹ã«M1ãM2ãM3ã®3ã€ã®ã¡ãã»ãŒãžããããšããŸãã çŸåšãã¢ã¯ã¿ãŒã¯M3ã®ã¿ã«é¢å¿ããããŸããããããM3ã«å°éããåã«ãã¢ã¯ã¿ãŒã¯æåã«M1ã次ã«M2ãæœåºããŸãããããŠã圌ã¯åœŒããšäœãããŸããïŒ
ç¹°ãè¿ããŸããããã®äŒè©±ã®äžç°ãšããŠãErlangããã®éžæçåä¿¡ã¡ã«ããºã ãšAkkaããã®é èœã«ã€ããŠã¯è§ŠããŸããã
äžæ¹ãCSP-shnyããã»ã¹ã«ã¯ãçŸåšã¡ãã»ãŒãžãèªã¿åããããã£ãã«ãéžæããæ©èœããããŸãããã®ãããCSPããã»ã¹ã«ã¯ãC1ãC2ãããã³C3ã®3ã€ã®ãã£ãã«ãå«ããããšãã§ããŸããçŸåšãCSPããã»ã¹ã¯C3ããã®ã¡ãã»ãŒãžã®ã¿ã«é¢å¿ããããŸããããã»ã¹ãèªã¿åãã®ã¯ãã®ãã£ãã«ã§ãããããŠã圌ã¯ããã«èå³ãããã°ãã£ã³ãã«C1ãšC2ã®å 容ã«æ»ããŸãã
åå¿æ§ãšããã¢ã¯ãã£ãæ§
ååãšããŠãã¢ã¯ã¿ãŒã¯ãªã¢ã¯ãã£ãã§ãããçä¿¡ã¡ãã»ãŒãžãããå Žåã«ã®ã¿æ©èœããŸãã
CSP-shyããã»ã¹ã¯ãçä¿¡ã¡ãã»ãŒãžããªãå Žåã§ãããã€ãã®äœæ¥ãå®è¡ã§ããŸããã·ããªãªã«ãã£ãŠã¯ããã®éããéèŠãªåœ¹å²ãæããå ŽåããããŸãã
ã¹ããŒããã·ã³
å®éãã¢ã¯ã¿ãŒã¯æéç¶æ ãã·ã³ïŒKAïŒã§ãããããã£ãŠããµããžã§ã¯ããšãªã¢ã«å€ãã®æéç¶æ ãã·ã³ããããããããè€éã§éå±€çãªæéç¶æ ãã·ã³ã§ãã£ãŠããå®å®è¹å®è£ ãCSPããã»ã¹ã«è¿œå ããããããã¢ã¯ã¿ãŒã¢ãã«ã«åºã¥ããŠå®è£ ããæ¹ãã¯ããã«ç°¡åã§ãã
C ++ã§ã¯ããã€ãã£ãCSPãµããŒãã¯ãŸã ãããŸããã
Goèšèªã®çµéšã¯ãããã°ã©ãã³ã°èšèªãšãã®æšæºã©ã€ãã©ãªã®ã¬ãã«ã§ãµããŒããå®è£ ãããŠããå ŽåãCSPã¢ãã«ã䜿çšããããšãããã«ç°¡åã§äŸ¿å©ãã瀺ããŠããŸãã
Goã§ã¯ããCSPããã»ã¹ãïŒå¥åãŽã«ãŒãã³ïŒã®äœæãç°¡åã§ããã£ã³ãã«ã®äœæãšæäœãç°¡åã§ããè€æ°ã®ãã£ã³ãã«ãäžåºŠã«æäœããããã®çµã¿èŸŒã¿æ§æããããŸãïŒGo-shny selectãèªã¿åãã ãã§ãªãæžã蟌ã¿ã§ãæ©èœããŸãïŒãæšæºã©ã€ãã©ãªã¯goroutinãèªèããŠãããgoroutinãstdlibãããããã¯åŒã³åºããè¡ããšãã«ããããåãæ¿ããããšãã§ããŸãã
C ++ã§ã¯ããããŸã§ã®ãšããïŒèšèªã¬ãã«ã§ïŒã¹ã¿ãã¯ãã«ã³ã«ãŒãã³ã®ãµããŒãã¯ãããŸããããããã£ãŠãC ++ã§ã®CSPã®æäœã¯ãæŸèæã§ã¯ãªãã«ããŠããå Žæã«ãã£ãŠã¯èŠãããããããŸãã...åãGoã®å Žåããããããèªäœã«ãã£ãšæ³šæãæãå¿ èŠãããããšã¯ç¢ºãã§ãã
ã¢ãããŒãçªå·3ïŒã¿ã¹ã¯ïŒasyncãfutureãwait_allã...ïŒ
æãäžè¬çãªèšèã§ã®ã¿ã¹ã¯ããŒã¹ã®ã¢ãããŒãã«ã€ããŠ
ã¿ã¹ã¯ããŒã¹ã®ã¢ãããŒãã®æå³ã¯ãè€éãªæäœãããå Žåããã®æäœãåå¥ã®ã¿ã¹ã¯ã¹ãããã«åå²ããåã¿ã¹ã¯ïŒã¿ã¹ã¯ïŒãåäžã®ãµãæäœãå®è¡ããããšã§ãã
ãããã®ã¿ã¹ã¯ã¯ãç¹å¥ãªéåææäœã§éå§ããŸããéåææäœã¯ãã¿ã¹ã¯ãå®äºããåŸãã¿ã¹ã¯ã«ãã£ãŠè¿ãããå€ãé 眮ãããå°æ¥ã®ãªããžã§ã¯ããè¿ããŸãã
Nåã®ã¿ã¹ã¯ãèµ·åããNåã®ãªããžã§ã¯ãïŒå°æ¥ïŒãåãåã£ãåŸãããããã¹ãŠãäœããã®åœ¢ã§ãã§ãŒã³ã§ç·šæããå¿ èŠããããŸããã¿ã¹ã¯No. 1ãšNo. 2ãå®äºãããšããããã«ãã£ãŠè¿ãããå€ã¯ã¿ã¹ã¯No. 3ã«åé¡ãããããã§ããã¿ã¹ã¯3ãå®äºãããšãæ»ãå€ã¯ã¿ã¹ã¯4ã5ã6ã«è»¢éãããŸããç
ãã®ãããªãã¿ã€ãã«ã¯ãç¹å¥ãªæ段ã䜿çšãããŸããããšãã°ãfutureãªããžã§ã¯ãã®.thenïŒïŒã¡ãœããããé¢æ°wait_allïŒïŒãwait_anyïŒïŒãªã©ã
ãæã§ããã®ãããªèª¬æã¯ããŸãæ確ã§ã¯ãªããããããªãã®ã§ãã³ãŒãã«ç§»ããŸããããç¹å®ã®ã³ãŒãã«é¢ããäŒè©±ã®äžã§ãç¶æ³ã¯ããæ確ã«ãªããããããŸããïŒäºå®ã§ã¯ãããŸããïŒã
ã¿ã¹ã¯ããŒã¹ã®ã¢ãããŒãã®Request_handlerã³ãŒã
ã¿ã¹ã¯ã«åºã¥ããŠçä¿¡HTTPãªã¯ãšã¹ããåŠçããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
void handle_request(const execution_context & ctx, request req) { auto user_info_ft = async(ctx.http_client_ctx(), [req] { return retrieve_user_info(req.user_id()); }); auto original_image_ft = async(ctx.http_client_ctx(), [req] { return download_image(req.image_id()); }); when_all(user_info_ft, original_image_ft).then( [&ctx, req](tuple<future<user_info>, future<image_loaded>> data) { async(ctx.image_mixer_ctx(), [&ctx, req, d=std::move(data)] { return mix_image(get<0>(d).get().watermark_image(), get<1>(d).get()); }) .then([req](future<mixed_image> mixed) { async(ctx.http_srv_ctx(), [req, im=std::move(mixed)] { make_reply(...); }); }); }); }
ããã§äœãèµ·ãã£ãŠããã®ããç解ããŠã¿ãŸãããã
ãŸããç¬èªã®HTTPã¯ã©ã€ã¢ã³ãã®ã³ã³ããã¹ãã§å®è¡ããå¿ èŠãããããŠãŒã¶ãŒã«é¢ããæ å ±ãèŠæ±ããã¿ã¹ã¯ãäœæããŸããè¿ãããfutureãªããžã§ã¯ãã¯ãuser_info_ftå€æ°ã«æ ŒçŽãããŸãã
次ã«ãåæ§ã®ã¿ã¹ã¯ãäœæããŸãããããç¬èªã®HTTPã¯ã©ã€ã¢ã³ãã®ã³ã³ããã¹ãã§å®è¡ããå¿ èŠããããå ã®ã€ã¡ãŒãžãããŒãããŸããè¿ãããfutureãªããžã§ã¯ãã¯ãoriginal_image_ftå€æ°ã«ä¿åãããŸãã
次ã«ãæåã®2ã€ã®ã¿ã¹ã¯ãå®äºãããŸã§åŸ ã€å¿ èŠããããŸããçŽæ¥æžãçãããã®ïŒwhen_allïŒuser_info_ftãoriginal_image_ftïŒãäž¡æ¹ã®å°æ¥ã®ãªããžã§ã¯ããå€ãååŸããããå¥ã®ã¿ã¹ã¯ãå®è¡ããŸãããã®ã¿ã¹ã¯ã¯ãéãããšå ã®ç»åãå«ãããããã¹ã¯ãåããImageMixerã®ã³ã³ããã¹ãã§å¥ã®ã¿ã¹ã¯ãå®è¡ããŸãããã®ã¿ã¹ã¯ã¯ç»åãæ··åããå®äºãããšãHTTPãµãŒããŒã³ã³ããã¹ãã§å¥ã®ã¿ã¹ã¯ãèµ·åãããHTTPå¿çãçæãããŸãã
ãããããã³ãŒãã§äœãèµ·ãã£ãŠããã®ãã®ãã®ãããªèª¬æã¯ããŸãæ確ã«ãããŠããŸããããããã£ãŠãã¿ã¹ã¯ã«çªå·ãä»ããŸãããã
ãããŠããããã®éã®äŸåé¢ä¿ãèŠãŠã¿ãŸãããïŒããããã¿ã¹ã¯ã®é åºãæµããŸãïŒã
ãããŠããã®ç»åããœãŒã¹ã³ãŒãã«ãªãŒããŒã¬ã€ãããšãããæ確ã«ãªãããšãé¡ã£ãŠããŸãã
ã¿ã¹ã¯ããŒã¹ã®ã¢ãããŒãã®æ©èœ
å¯èŠæ§
ãã§ã«æãããªã¯ãã®æåã®æ©èœã¯ãã¿ã¹ã¯ã®ã³ãŒãã®å¯èŠæ§ã§ãããã¹ãŠã圌女ãšããŸãããããã§ã¯ãããŸããã
ããã§ã¯ãã³ãŒã«ããã¯å°çã®ãããªãã®ã«èšåã§ããŸããNode.jsããã°ã©ããŒã¯éåžžã«ããç¥ã£ãŠããŸããããããTaskãšå¯æ¥ã«é£æºããC ++ããã¯ããŒã ãããã®ãŸãã«ã³ãŒã«ããã¯å°çã«çªå ¥ããŸãã
ãšã©ãŒåŠç
å¥ã®èå³æ·±ãæ©èœã¯ãšã©ãŒåŠçã§ãã
äžæ¹ã§ã¯ãé¢ä¿è ãžã®ãšã©ãŒæ å ±ã®é ä¿¡ã§éåæããã³å°æ¥ã䜿çšããå Žåãã¢ã¯ã¿ãŒãŸãã¯CSPã®å Žåãããããã«ç°¡åã«ãªããŸããçµå±ãCSPããã»ã¹Aã§ããã»ã¹Bã«ãªã¯ãšã¹ããéä¿¡ããå¿çã¡ãã»ãŒãžãåŸ ã€å Žåããªã¯ãšã¹ãã®å®è¡äžã«Bã§ãšã©ãŒãçºçããå Žåãããã»ã¹Aã«ãšã©ãŒãé ä¿¡ããæ¹æ³ã決å®ããå¿ èŠããããŸãã
- ãŸãã¯ãå¥ã®çš®é¡ã®ã¡ãã»ãŒãžãšãããåä¿¡ããããã®ãã£ãã«ãäœæããŸãã
- ãŸãã¯ãåäžã®ã¡ãã»ãŒãžã§çµæãè¿ããŸãããã®ã¡ãã»ãŒãžã¯ãéåžžã®èª€ã£ãçµæã®std :: variantã«ãªããŸãã
æªæ¥ã®å Žåããã¹ãŠãããã·ã³ãã«ã§ããæªæ¥ããéåžžã®çµæãæœåºããããäŸå€ãã¹ããŒãããŸãã
ããããäžæ¹ã§ããšã©ãŒã®ã«ã¹ã±ãŒãã«ç°¡åã«ééããå¯èœæ§ããããŸããããšãã°ãã¿ã¹ã¯No. 1ã§äŸå€ãçºçãããã®äŸå€ã¯å°æ¥ã®ãªããžã§ã¯ãã«èœã¡ãã¿ã¹ã¯No. 2ã«æž¡ãããŸãããåé¡2ã§ã¯ãæªæ¥ãã䟡å€ããšãããšããŸããããäŸå€ããããŸããããããŠãã»ãšãã©ã®å ŽåãåãäŸå€ãã¹ããŒããŸãããããã£ãŠã次ã®æªæ¥ã«èœã¡ãã¿ã¹ã¯No. 3ã«é²ã¿ãŸãããŸããäŸå€ããããŸãããããããããããªãªãŒã¹ãããŸããç
äŸå€ããã°ã«èšé²ããããšããã°ã§åãäŸå€ãç¹°ãè¿ãç¹°ãè¿ããããã§ãŒã³å ã®1ã€ã®ã¿ã¹ã¯ããå¥ã®ã¿ã¹ã¯ã«ç§»åããããšãããããŸãã
ã¿ã¹ã¯ãšã¿ã€ããŒ/ã¿ã€ã ã¢ãŠãã®ãã£ã³ã»ã«
ãŸããã¿ã¹ã¯ããŒã¹ã®ãã£ã³ããŒã³ã®ãã1ã€ã®éåžžã«èå³æ·±ãæ©èœã¯ãäœãåé¡ãçºçããå Žåã«ã¿ã¹ã¯ããã£ã³ã»ã«ããããšã§ããå®éã150åã®ã¿ã¹ã¯ãäœæããæåã®10åãå®äºããäœæ¥ãç¶ããæå³ããªãããšã«æ°ä»ãããšããŸããæ®ãã®140ããã£ã³ã»ã«ããã«ã¯ã©ãããã°ããã§ããïŒããã¯éåžžã«è¯ã質åã§ã:)
å¥ã®åæ§ã®è³ªåã¯ãã¿ã€ããŒãšã¿ã€ã ã¢ãŠãã§åéã®ã¿ã¹ã¯ãäœãæ¹æ³ã§ããå€éšã·ã¹ãã ã«ã¢ã¯ã»ã¹ããŠãããåŸ æ©æéã50ããªç§ã«å¶éããããšããŸããã¿ã€ããŒã®èšå®æ¹æ³ãã¿ã€ã ã¢ãŠãã®æéåããžã®å¯Ÿå¿æ¹æ³ãã¿ã€ã ã¢ãŠãã®æéãåããå Žåã®ã¿ã¹ã¯ãã§ãŒã³ã®äžææ¹æ³ ç¹°ãè¿ããŸãããå°ããã®ã¯çãããããç°¡åã§ã:)
äžæ£è¡çº
ããã§ã¯ãã¿ã¹ã¯ããŒã¹ã®ã¢ãããŒãã®æ©èœã«ã€ããŠã話ãããŸãã瀺ãããŠããäŸã§ã¯ãå°ãã®äžæ£è¡çºãé©çšãããŠããŸãã
auto user_info_ft = async(ctx.http_client_ctx(), [req] { return retrieve_user_info(req.user_id()); }); auto original_image_ft = async(ctx.http_client_ctx(), [req] { return download_image(req.image_id()); });
ããã§ã¯ã2ã€ã®ã¿ã¹ã¯ãç¬èªã®HTTPãµãŒããŒã®ã³ã³ããã¹ãã«éä¿¡ãããããããå éšã§ããããã³ã°æäœãå®è¡ããŸããå®éããµãŒãããŒãã£ãµãŒãã¹ãžã®2ã€ã®ãªã¯ãšã¹ãã䞊è¡ããŠåŠçã§ããããã«ããã«ã¯ãããã§ç¬èªã®éåæã¿ã¹ã¯ã®ãã§ãŒã³ãäœæããå¿ èŠããããŸããããããããœãªã¥ãŒã·ã§ã³ãå€å°èŠããããããã¬ãŒã³ããŒã·ã§ã³ã®ã¹ã©ã€ãã«åãããããã«ãããããŸããã§ããã
ã¢ã¯ã¿ãŒ/ CSP vsã¿ã¹ã¯
3ã€ã®ã¢ãããŒããæ€èšããã¢ã¯ã¿ãŒãšCSPããã»ã¹ãäºãã«é¡äŒŒããŠããå Žåãã¿ã¹ã¯ããŒã¹ã®ã¢ãããŒãã¯ãããã®ãããã«ã䌌ãŠããªãããšãããããŸããããããŠãActors / CSPã¯Taskãšå¯Ÿç §çã§ããããã«æããããããããŸããã
ããããå人çã«ã¯ãç§ã¯å¥ã®èŠç¹ã奜ãã§ãã
ã¢ã¯ã¿ãŒã®ã¢ãã«ãšCSPã«ã€ããŠè©±ããšããã¿ã¹ã¯ã®å解ã«ã€ããŠè©±ããŸãããã®ã¿ã¹ã¯ã§ã¯ãåå¥ã®ç¬ç«ãããšã³ãã£ãã£ãéžã³åºãããããã®ãšã³ãã£ãã£ã®ã€ã³ã¿ãŒãã§ã€ã¹ã説æããŸããã©ã®ã¡ãã»ãŒãžãéä¿¡ããã©ã®ã¡ãã»ãŒãžãåä¿¡ããã©ã®ãã£ãã«ãçµç±ããŠã¡ãã»ãŒãžãéä¿¡ãããã説æããŸãã
ã€ãŸãã¢ã¯ã¿ãŒãšCSPãæäœããŠãã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠè©±ããŸãã
ããããã¿ã¹ã¯ãåã ã®ã¢ã¯ã¿ãŒãšCSPããã»ã¹ã«åå²ãããšããŸãã圌ãã¯ã©ã®ãããæ£ç¢ºã«ä»äºãããŠããŸããïŒ
ã¿ã¹ã¯ããŒã¹ã®ã¢ãããŒããæ¡çšãããšããå®è£ ã«ã€ããŠè©±ãå§ããŸããç¹å®ã®äœæ¥ãã©ã®ããã«å®è¡ãããããã©ã®å¯æäœãã©ã®é åºã§å®è¡ããããããããã®å¯æäœãããŒã¿ã«åŸã£ãŠã©ã®ããã«æ¥ç¶ãããããªã©ã«ã€ããŠ
ã€ãŸãTaskã§ã®äœæ¥ã«ã€ããŠã¯ãå®è£ ã«ã€ããŠèª¬æããŠããŸãã
ãã®çµæãã¢ã¯ã¿ãŒ/ CSPãšã¿ã¹ã¯ã¯çžäºã«ããã»ã©å¯Ÿç«ããŸããããçžäºã«è£å®ããŸããã¢ã¯ã¿ãŒ/ CSPã䜿çšããŠãã¿ã¹ã¯ãå解ããã³ã³ããŒãã³ãéã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ã§ããŸãããããŠãã¿ã¹ã¯ã䜿çšããŠç¹å®ã®ã³ã³ããŒãã³ããå®è£ ã§ããŸãã
ããšãã°ãActorã䜿çšããå ŽåãImageMixerãªã©ã®ãšã³ãã£ãã£ããããŸããããã¯ãã¹ã¬ããããŒã«äžã®ç»åã§æäœããå¿ èŠããããŸããäžè¬çã«ãImageMixerã¢ã¯ã¿ãŒã䜿çšããŠã¿ã¹ã¯ããŒã¹ã®ã¢ãããŒãã䜿çšããããšã劚ãããã®ã¯ãããŸããã
ã©ããèŠãŠãäœããã¹ããïŒ
C ++ã§ã¿ã¹ã¯ãæäœãããå Žåã¯ãä»åŸã®C ++ 20ã®æšæºã©ã€ãã©ãªã«ç®ãåããããšãã§ããŸãã圌ãã¯ãã§ã«.thenïŒïŒã¡ãœãããšã空ãé¢æ°wait_allïŒïŒããã³wait_anyããã§ã«è¿œå ããŠããŸãã詳现ã«ã€ããŠã¯ãcppreferenceãåç §ããŠãã ããã
ãŸããæ°ããasync ++ã©ã€ãã©ãªã«ã¯ãŸã çšé ããååãšããŠãå¿ èŠãªãã®ã¯ãã¹ãŠãããŸãããå°ããœãŒã¹ãå€ããŠãã ããã
ããã«å€ãMicrosoft PPLã©ã€ãã©ãªããããŸããå¿ èŠãªãã®ã¯ãã¹ãŠæã£ãŠããŸããããœãŒã¹ã¯èªåã®ãã®ã§ãã
Intel TBBã©ã€ãã©ãªã«é¢ããåå¥ã®è¿œå ãç§ã®æèŠã§ã¯ãTBBã®ã¿ã¹ã¯ã°ã©ãã¯æ¢ã«ããŒã¿ãããŒã¢ãããŒãã§ãããããã¿ã¹ã¯ããŒã¹ã®ã¢ãããŒãã«é¢ãã話ã§ã¯èšåãããŠããŸããããããŠããã®ã¬ããŒããç¶ãã°ãIntel TBBã«ã€ããŠã®è©±ã¯ééããªãæ¥ãã§ãããããããŒã¿ãããŒã«ã€ããŠã®è©±ã®æèã§ã§ãã
ãã£ãšé¢çœã
æè¿ãHabréã§ãAnton Polukhinã«ããèšäºããããŸããããC ++ 20ãæºåããŠããŸããå®éã®äŸã䜿çšããã³ã«ãŒãã³TSãã
ã¿ã¹ã¯ããŒã¹ã®ã¢ãããŒããšC ++ 20ã®ã¹ã¿ãã¯ã¬ã¹ã³ã«ãŒãã³ãšã®çµã¿åããã«ã€ããŠèª¬æããŠããŸãããããŠãã¿ã¹ã¯ã®å¯èªæ§ã«åºã¥ããã³ãŒãã¯ãCSPããã»ã¹ã§ã®ã³ãŒãã®å¯èªæ§ã«è¿ã¥ãããšãå€æããŸããã
ã ãã誰ããã¿ã¹ã¯ããŒã¹ã®ã¢ãããŒãã«èå³ããããªãããã®èšäºãèªãã®ã¯çã«ããªã£ãŠããŸãã
ãããã«
ããŠãçµæãããŸãå€ããªãã®ã§ãçµæã«ç§»ãæã§ãã
ç§ãèšãããäž»ãªããšã¯ãçŸä»£ã®äžçã§ã¯ãããçš®ã®ãã¬ãŒã ã¯ãŒã¯ãéçºããããç¹å®ã®äœã¬ãã«ã®ã¿ã¹ã¯ã解決ããå Žåã«ã®ã¿ã裞ã®ãã«ãã¹ã¬ãããå¿ èŠã«ãªãå Žåããããšããããšã§ãã
ãŸããã¢ããªã±ãŒã·ã§ã³ã³ãŒããèšè¿°ããŠããå Žåããã¢ã¹ã¬ãããäœã¬ãã«ã®åæããªããã£ãããŸãã¯ããã¯ããªãŒã³ã³ããã«å ããŠããã¯ããªãŒã¢ã«ãŽãªãºã ãå¿ èŠãšããããšã¯ã»ãšãã©ãããŸãããé·ãéãæéããããŠãã¹ããããããèªäœãååã«èšŒæãããã¢ãããŒãããããŸãã
- 俳åª
- éä¿¡é 次ããã»ã¹ïŒCSPïŒ
- ã¿ã¹ã¯ïŒéåæãçŽæãå ç©ãªã©ïŒ
- ããŒã¿ãããŒ
- ãªã¢ã¯ãã£ãããã°ã©ãã³ã°
- ...
ãããŠæãéèŠãªã®ã¯ãC ++ã§äœ¿çšã§ããæ¢è£œã®ããŒã«ãããããšã§ããäœã埪ç°ãããå¿ èŠã¯ãããŸãããè©ŠããŠã¿ãŠãæ°ã«å ¥ã£ããæäœã«ç§»ãããšãã§ããŸãã
ãšãŠãç°¡åïŒè©ŠããŠã¿ãŠãæäœãéå§ããŠãã ããã