ãã®èšäºããããã¯ã®ãªãããŒã¿æ§é ã«é¢ããäžé£ã®ã¡ã¢ã®å§ãŸãã瀺ããŠããããšãé¡ã£ãŠããŸãã ããã¯ããªãŒããŒã¿æ§é ãšã¯äœããããããå®è£ ããæ¹æ³ãããã¯ããªãŒã³ã³ããã«é©ããSTLæšæºã©ã€ãã©ãªã®ã³ã³ããã®æŠå¿µãããã³ããã¯ã䜿çšãã䟡å€ãããå ŽåïŒãããšããŠãïŒã«ã€ããŠãç§ã®çµéšã芳å¯ãèããhabrasocietyãšå ±æãããããªãŒã®ããŒã¿æ§é ã
ããã¯ããªãŒããŒã¿æ§é ã«ã€ããŠè©±ãããšã¯ãã¢ãããã¯æäœãç¹å®ã®ããã°ã©ãã³ã°èšèªã§å®è£ ãããã¡ã¢ãªã¢ãã«ïŒãã¡ããããã®ã¡ã¢ãªã¢ãã«ã«ã€ããŠèããã»ã©èšèªãå€ããªã£ãŠããªãéãïŒãå®å šãªã¡ã¢ãªè§£æŸãã³ã³ãã€ã©ã圌ãã䜿çšããæé©åãææ°ã®ããã»ããµã¢ãŒããã¯ãã£-ãããã®ãããã¯ã¯ãã¹ãŠããã®ãµã€ã¯ã«ã§ããçšåºŠè§ŠããããŸãã ç§ã¯èªåèªèº«ããããã®çµ¶å¯Ÿçãªå°é家ãšã¯èããŠããŸããããããããã¹ãŠã®ããšã«ã€ããŠè©±ãããšã®èªç±ãåããŸãã ãã®äžæ¹ã§ããããã«ã€ããŠã®èãããªãã£ããããããã¯ããªãŒã³ã³ãããšå®å šãªã¡ã¢ãªåçã¢ã«ãŽãªãºã ã®ãªãŒãã³ãœãŒã¹C ++ã©ã€ãã©ãªã§ããlibcdsã©ã€ãã©ãªãäœæããã³éçºã§ããŸããã§ããã Cdsã¯Concurrent Data Structureã®ç¥ã§ãæ¥é èŸãlibãã¯å¥åŠãªããšã«ãã©ã€ãã©ãªãã§ãã
å³æžé€šã®æŽå²ããå§ããŸãããã 2006幎ã«æ»ã£ãã
2006幎
ãã®åŸãããã°ã¹ãªãŒã®ããé»æ°éä¿¡äºæ¥è åãã®ãœãããŠã§ã¢ãäœæããããªã倧ããªäŒç€Ÿã§åããŸããã ããŒããŠã§ã¢ãã©ãããã©ãŒã åç©åçšã®éåžžã«è€éãªãµãŒããŒã¢ããªã±ãŒã·ã§ã³ãéçºããŸããããããããããã©ãŒãã³ã¹ã®åé¡ããããŸããïŒåžžã«ãããªãã§ãããïŒã ç¹ã«ãããŒã¿åŠçã䞊ååããããšã§è§£æ±ºããŸããã ãã€ãã®ããã«ã䞊ååã¯å ±æããŒã¿ã®åºçŸãããããããã®ããŒã¿ãžã®ã¢ã¯ã»ã¹ã¯åæããå¿ èŠããããŸããã ããè°è«ã®äžã§ãååããããã¯ããªãŒãã¥ãŒã«ã€ããŠäœãèããããšã¯ãããŸããããšå°ããŠæ©ãåããŸãããåœæãç§ã¯ããã«ã€ããŠäœãç¥ããŸããã§ããã ããããGoogleã«å°ãããšãããããã¯ããªãŒãã¥ãŒã®æ¬äŒŒã³ãŒããèšèŒãããèšäºãããã€ãèŠã€ãããŸããã ããããæ°åèªãã åŸãç§ã¯äœãç解ããŸããã§ããã ããæ£ç¢ºã«ã¯ãè¢ããŸããäžããŠãä»ããïŒããšèšã£ãåŸããç§ã¯äœãç解ããŠããŸãããã®ç¶æ ã«ãªããŸãããåžžèã§ã ã»ã°ã¡ã³ããŒã·ã§ã³ãã©ãŒã«ããš1ãææŠã£ãåŸãç§ã®åžžèã¯ãããããŸããã ããããç§ã¯äœãç解ããŸããã§ããã ç§ã¯ãããäžè¬çã«ã©ã®ããã«æ©èœãããç解ã§ããŸããã§ãããITãäœããã®åœ¢ã§æ©èœããå Žåã§ããC ++ã§ã©ã®ããã«å®è£ ã§ããããç解ããŠããŸããã§ããã ããããã©ããããããããã¯æ©èœããã¯ãã§ããããã§ãªããã°ãè³¢ã人ã¯ãããã®èšäºãæžããªãã§ãããããä»ã®è³¢ã人ã¯ããããåç §ããŸããïŒèšäºã¯ç§åŠçã§ãããããã®çµããã«ãç§åŠçã§ã¯ãã€ãã®ããã«ãæåŠã®ãªã¹ããäžããããŸããïŒã ãããã®ãªã³ã¯ããã©ããšãããã»ããµã¢ãŒããã¯ãã£ã«é¢ãããœãããŠã§ã¢éçºè ã¬ã€ããããããã¯ããªãŒã¢ã«ãŽãªãºã ãå®è£ ããããã®äžè¬çãªã¢ãããŒãã«é¢ããèšäºã®ã¬ãã¥ãŒã«è³ããŸã§ã1幎ã®éã«æ°åã¡ã¬ãã€ãã®æçšãªæ å ±ãèªã¿ãŸããã éäžã§ããã®ãããã¯ã§ïŒãã¡ããC ++ã§ïŒãããããããŠãç¹å®ã®ããªããã£ããå®è£ ããŸããã çŸæç¹ïŒ2006幎ãã2007幎ïŒã§ã¯ãC ++ 11æšæºã¯ãŸã 楜芳çã«C ++ 0xãšåŒã°ããSTLã«ã¯ã¢ãããã¯ããªããã£ãã¯ãªããã€ã³ã¿ãŒãã§ã€ã¹ã®æŠèŠã瀺ãããã ãã§ãã³ã³ãã€ã©ãã¢ãããã¯ããªããã£ãã«ãããããããããšããããŸããç¹ã«éèŠãªé åã§æ©èœããªãã³ãŒããçºè¡ããã 2008幎ãŸã§ã«ãlibcdsã©ã€ãã©ãªã®ãŒããã茪éã圢ã«ãªãå§ããŸããã ããŸããŸãªãã©ãããã©ãŒã ã§ã®æåã®ãã¹ãã§ã¯ãåæ°ã¥ãããããæã«ã¯é©ãã¹ãïŒã50åé«éã«ãªããŸãã!!!ãïŒçµæãåŸãããããã¯ããªãŒã®äžçã«å®å šã«é£ã³èŸŒã¿ãŸããã 2010幎ãç§ã¯SourceForgeã«ã©ã€ãã©ãªã®æåã®ïŒ0.5.0ïŒããŒãžã§ã³ãæçš¿ããŸããã çŸåšãã©ã€ãã©ãªã®ææ°ããŒãžã§ã³ã¯1.4.0ã§ãããããŒãžã§ã³1.5.0ã§äœæ¥ãé²è¡äžã§ãã
ããã¯ããªãŒããŒã¿æ§é ã®äžè¬çãªã¬ãã¥ãŒã«é²ã¿ãŸãã ãã®ãããè€éãªãœãããŠã§ã¢ãããžã§ã¯ããç¹ã«ãµãŒããŒãããžã§ã¯ãã®èšèšãšéçºã«ãããããã°ã©ãã®äž»ãªã¿ã¹ã¯ã¯ãã¿ãŒã²ãããã©ãããã©ãŒã ã§å©çšå¯èœãªãã¹ãŠã®ãªãœãŒã¹ãæãå¹æçã«äœ¿çšããããšã§ãã ææ°ã®ã³ã³ãã¥ãŒã¿ãŒã¯ãã¹ããŒããã©ã³ãã¿ãã¬ããã§ããã«ãããã»ããµæ©åšã§ãããããçç£æ§ãåäžãããæ¹æ³ã®1ã€ã¯ããã°ã©ã ã䞊ååããããšã§ãã 䞊åã¹ã¬ããïŒã¹ã¬ããïŒã¯ãäžéšã®å ±æããŒã¿ïŒå ±æããŒã¿ïŒãåŠçããŸãã ãããã£ãŠãç§ãã¡ã®äž»ãªã¿ã¹ã¯ã¯ããã®ãããªå ±æããŒã¿ãžã®äžŠåã¢ã¯ã»ã¹ãæŽçããããšã§ãã
åäžçŽã®80幎代ã«ã¯ãããããæ§é ããã°ã©ãã³ã°ãæ®åããåªããããã°ã©ã ãäœæããæ¹æ³ãšããŠäœçœ®ä»ããããŸããã æ§é ããã°ã©ãã³ã°ã®è¬çœªè ã¯ããã¹ã«ã«èšèªã®èè ã§ãããã³ã©ã¹ã»ã¯ãŒã¹ã§ããããã¹ãã»ã©ãŒã®æ¬ãã¢ã«ãŽãªãºã +ããŒã¿æ§é =ããã°ã©ã ããå·çããŸããã èå³æ·±ãããšã«ããã®å€ãåŒã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãæäŸããpthreadãWin32 APIãªã©ã®ææ°ã®APIã®åŒ±ç¹ãæããŠããŸãïŒAPIã¯ã䞊åããã°ã©ã ïŒãã®ããŒã«ã¯ã¹ã¬ãããã¹ã¬ããïŒãæ§ç¯ããããã®ããŒã«ãæäŸããŸãããå ±æã¢ã¯ã»ã¹ãæäŸãã䞊åããŒã¿æ§é ãæ§ç¯ããããã®ããŒã«ã¯æäŸããŸããã 代ããã«ãAPIã¯ãåæããªããã£ãã®åœ¢åŒã§ããŒã¿ã¢ã¯ã»ã¹ãå¶éããæ段ãæäŸããŸãã ãã ããåæã¯äžŠåããã°ã©ã ã®ããã«ããã¯ã§ãã åºæ¬çã«ãåæã¯äžŠååŠçã®å¯Ÿæ¥µã«ãããŸãã䞊ååã¢ã«ãŽãªãºã ãã·ãŒã±ã³ã·ã£ã«ããŒã¿æ§é ãæäœããåæããªããã£ãïŒã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ããã¥ãŒããã¯ã¹ãæ¡ä»¶å€æ°ïŒcondvarïŒïŒãæäŸããŸãã ãã®çµæãããŒã¿æ§é ã«ã¢ã¯ã»ã¹ããããã«ãã¹ãŠã®ã¹ã¬ããããã¥ãŒã«å ¥ããããã«ãã䞊ååŠçãåæ¢ããŸãã åæããªããã£ãã¯OSã«ãŒãã«ã®ãªããžã§ã¯ãã§ããå Žåãããããããã®ãããªãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ã¯éåžžã«é«äŸ¡ã«ãªãå¯èœæ§ããããŸããã³ã³ããã¹ãã®åãæ¿ããOSã«ãŒãã«ã¬ãã«ãžã®ç§»åãåæããªããã£ãã§ä¿è·ãããããŒã¿ãžã®ã¢ã¯ã»ã¹ãåŸ æ©ãããã¥ãŒã®ãµããŒããªã©ãå¿ èŠã«ãªãå ŽåããããŸããããŒã¿å ã®1ã€ã®ãã€ã³ã¿ãŒã®å€ãå€æŽãããããã€ãŸãã1ã€ãŸãã¯2ã€ã®ã¢ã»ã³ãã©ãŒåœä»€ãå®è¡ããŸãã éæ¥è²»ã¯éåžžã«é«ããªãå¯èœæ§ããããŸãïŒå®éã«ã¯ãããŸãïŒã ããã«ãOSã«ãŒãã«ã®ãªããžã§ã¯ãã¯ãæ°éãå¶éããããªãœãŒã¹ã§ããããšãå¿ããªãã§ãã ããã
åæã®ãã1ã€ã®æ¬ ç¹ã¯ãã¹ã±ãŒã©ããªãã£ãäœãããšã§ãã ã¹ã¬ããã®æ°ãå¢ãããšãããŒã¿ãžã®åæã¢ã¯ã»ã¹ãããã°ã©ã ã®ããã«ããã¯ã«ãªããŸãã å€ãã®å Žåãçç£æ§ã®æ¯äŸçãªå¢å ã®ä»£ããã«ã䞊å床ã®å¢å ã«ãããé«è² è·æ¡ä»¶äžã§ãã®å£åãçããŸãã
Wirthã®å ¬åŒãã¢ã«ãŽãªãºã +ããŒã¿æ§é =ããã°ã©ã ãã«åºã¥ããŠãlibcdã®ç 究ã§ã¯ããŒã¿æ§é ã®ã¿ã«çŠç¹ãåœãŠãŸãããã©ã€ãã©ãªã«ã¯ã䞊åãœãŒãã¢ã«ãŽãªãºã ã䞊åfor-eachã¢ã«ãŽãªãºã ã¯ãããŸããã ã©ã€ãã©ãªã«ã¯ã競åããããŒã¿æ§é ïŒãã¥ãŒããªã¹ããããããã»ãããªã©ïŒãšãããã¯ããªãŒããŒã¿ããµããŒãããããã«å¿ èŠãªã¢ã«ãŽãªãºã ã®ã¿ãå«ãŸããŠããŸãããŸãããããã¯å®å šãªã¡ã¢ãªåçã¢ã«ãŽãªãºã ã§ãã å€ãã®å Žåã1ã€ãŸãã¯å¥ã®ããŒã¿æ§é ãããã€ãã®å®è£ ã«ãã£ãŠè¡šãããŸãã ããã¯ããšããšèããããŠããŸããïŒååãšããŠããã¥ãŒãŸãã¯ããããå®è£ ããããã€ãã®èå³æ·±ãã¢ã«ãŽãªãºã ããããäžè¬çãªã±ãŒã¹ã§ã¯ã©ã¡ãããè¯ãããããããŸããïŒãŸãããè¯ãããŸãã¯ãæªãããšããæŠå¿µã¯çžå¯Ÿçã§ãããç¹å®ã®ããŒããŠã§ã¢ã«äŸåããŸããããŠãç¹å®ã®ã¿ã¹ã¯ã第äºã«ãã¢ã«ãŽãªãºã ãå®è£ ããŠä»ã®ã¢ã«ãŽãªãºã ãšæ¯èŒãããŸã§ããããè¯ããã©ããããããªãã§ãããã ããŠãã¢ã«ãŽãªãºã ãå®è£ ããã³ãããã°ãããŠããå Žåãã©ã€ãã©ãªã§ãã®å Žæããšã£ãŠã¯ãããŸããïŒãããŠããŠãŒã¶ãŒã«é£ããéžæãæäŸããŠãã ããïŒïŒ
åæ
çãªäœè«
ãšããã§ããã®ç¹ã«é¢ããŠãç§ã¯STLã«å¯Ÿãã䞻匵ãæã£ãŠããŸããããšãã°ããªãç§ã«ç¥ãããŠããSTLã®ãã¹ãŠã®å®è£
ã®ããããèµ€é»ããªãŒãšããŠäœæãããã®ã§ããïŒ ãããã®å®è£
ã«é©ããä»ã®å€ãã®ããŒã¿æ§é ããããŸããããšãã°ãAVLããªãŒã¯ãåããã€ããªããªãŒã§ããããã©ã³ã¹åºæºã匷åãããŠããŸãïŒããã«ãéçºïŒã ã©ãããããã®ãããªè³ªåã ãã§ãªããç§ã¯èµ€é»æšãšAVLæšã®å®è£
ãæ¯èŒããèšäºã«åºäŒã£ããããããã®èšäºã®çµè«ã¯èµ€é»æšãæ確ã«æ¯æããŠããªãã£ãïŒå€ãã®ã¿ã¹ã¯ïŒããã³å€ãã®ã¢ãŒããã¯ãã£ïŒã§AVLããªãŒã¯ããé«éã§ããããšãå€æããŸããã
ã¢ã«ãããã¯ç°å¢ã§ã¯ãå ±æããŒã¿ãžã®åæã¢ã¯ã»ã¹ãæäŸãã競äºåã®ããããŒã¿æ§é ãå®è£ ããæ¹æ³ã®ç 究ã«ãããããã€ãã®äž»èŠãªé åãäœæãããŸããã
- ããã¯ããªãŒã®ããŒã¿æ§é ã
- ãã现ããã¢ã«ãŽãªãºã ã
- ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãª
libcdsã«ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªããŒã¹ã®å®è£ ã¯ãããŸããã ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã¯ãäž»ã«æªæ¥ã«çŠç¹ãåœãŠãç 究ã®åºå€§ãªé åã§ãã ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã«åºã¥ãã¢ã«ãŽãªãºã ã¯ã倧ãŸãã«èšã£ãŠãã¡ã¢ãªãã¢ãããã¯ãã©ã³ã¶ã¯ã·ã§ã³ããµããŒãããŠããããšãæå³ããã¢ãããã¯ãã©ã³ã¶ã¯ã·ã§ã³ã¯ã¢ãããã¯ã«åãå ¥ãïŒã³ãããïŒãŸãã¯æåŠïŒããŒã«ããã¯ïŒã§ããŸãã æããã«ããã®ãããªã¡ã¢ãªã¯ããŒããŠã§ã¢ã§å®è£ ããå¿ èŠããããŸãã ç 究è èªèº«ã«ãããšãæ¢åã®ãœãããŠã§ã¢å®è£ ã«ã¯ååãªããã©ãŒãã³ã¹ããããŸããã æ£çŸ©ã®ããã«ãHaswell Intelããã»ããµã¯æ¢ã«åœä»€ã·ã¹ãã ã§ãã©ã³ã¶ã¯ã·ã§ã³ãµããŒããæã£ãŠããããšã«æ³šæãã䟡å€ããããŸãããã®ããããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®åçã«åºã¥ããã¢ã«ãŽãªãºã ã®å šçæã¯ããããã§ãã
ç²åºŠã®çŽ°ããã¢ã«ãŽãªãºã ã¯é«åºŠãªåææ¹æ³ã§ãããéåžžã¯OCãæäŸããåæããªããã£ãã®äœ¿çšã§ã¯ãªããã¹ãã³ããã¯ãªã©ã®ã軜ããã¢ãããã¯ããªããã£ãã®äœ¿çšã«åºã¥ããŠæ§ç¯ãããŸãã ãã®ãããªããªããã£ãã«åºã¥ããŠãããŒã¿æ§é ã®ããŒãïŒããŒãïŒãŸãã¯ããŒãžïŒããŒãžããã±ããïŒã®ã¬ãã«ã§åæãå®è¡ããããã®æ§é ã§ã®æäœã®ã¢ã«ãŽãªãºã ã«çµã¿èŸŒãŸããŠãã䞊åèªã¿åããŸãã¯äžŠåèšé²ãå¯èœã«ããããŒã¿æ§é ãæ§ç¯ãããŸãã å€ãã®å Žåãããã®çŽ°ããã³ã³ããã¯ãæ¯èŒç軜ãè² è·ã§ããã¯ããªãŒã³ã³ããã®ããã©ãŒãã³ã¹ã«å¹æµããããã©ãŒãã³ã¹ã瀺ããŸãã libcdsã©ã€ãã©ãªã¯ããã®ãããªããŒã¿æ§é ã軜èŠããŸããã
ããã¯ããªãŒã®ããŒã¿æ§é å€éšã¢ã¯ã»ã¹åæãå¿ èŠãšããªãããŒã¿æ§é ãåŒã³åºããŸãã ããã¯ãéå ¬åŒã®çŽç²ã«æè¡çãªå®çŸ©ã§ãããã³ã³ããã®å éšæ§é ãšãã®æäœãåæ ããŠããŸãã ããã§ã¯ãå€éšããšããèšèãæå³çã«åŒ·èª¿ãããŠããŸããããã¯ããªãŒããŒã¿æ§é ã®ããã»ããµããã®ç¹å¥ãªãµããŒãã䜿çšããªããšãæ§ç¯ããããšã¯ã»ãšãã©äžå¯èœã§ããããšãç解ããå¿ èŠããããŸãã ãã ããããã¯ããªãŒã³ã³ãããŒã§ã®ãã®çš®ã®ãµããŒãã¯ãã³ã³ãããŒã®ã·ãŒã±ã³ã·ã£ã«ã¡ãœãããžã®ã¢ã¯ã»ã¹ãåæããã®ã§ã¯ãªããã³ã³ãããŒã®ã¡ãœããå ã§é ç·ãããã¢ãããã¯å€æŽã¡ã«ããºã ããŸãã¯ã³ã³ãããŒã®ã³ã³ããŒãã³ãïŒããŒãããã±ãããããŒãžïŒã®ã¬ãã«ã§ã®å éšåæã«ãã£ãŠæäŸãããŸãã
ããã¯ããªãŒãªããžã§ã¯ãã®æ£åŒãªå®çŸ©ã¯[Her91]ã§ããä»ã®äœæ¥ã®çµæã«é¢ä¿ãªãã ããã¹ã¬ãããæéæ°ã®ã¹ãããã§ãªããžã§ã¯ãã®æäœãå®äºããããšãä¿èšŒããå Žåãå ±æãªããžã§ã¯ãã¯ããã¯ããªãŒãªããžã§ã¯ãïŒéããããã³ã°ãéããããã³ã°ãªããžã§ã¯ãïŒãšåŒã°ããŸãã¹ã¬ããïŒãããã®ä»ã®ã¹ã¬ãããã¯ã©ãã·ã¥ããå Žåã§ãïŒã åŸ æ©ãªããªããžã§ã¯ãã®ããå³å¯ãªæŠå¿µã¯ã åã¹ã¬ãããæéæ°ã®ã¹ãããã§ãªããžã§ã¯ãã®æäœãå®äºããå Žåããªããžã§ã¯ãã¯åŸ æ©ãªãã§ãããšèšããŸãã ããã¯ããªãŒç¶æ ã¯ãå°ãªããšã1ã€ã®ã¹ã¬ããã®ææ Œãä¿èšŒãã匷åãªåŸ æ©ããªãŒç¶æ ã¯ããã¹ãŠã®ã¹ã¬ããã®æ£åžžãªå®è¡ãä¿èšŒããŸãã 競åããããŒã¿æ§é ã®çè«ã«ã¯ãç·åœ¢åå¯èœæ§[Her90]ã®æŠå¿µããããŸããããã¯ãããã¯ããªãŒã¢ã«ãŽãªãºã ã®æ£ç¢ºæ§ã®åœ¢åŒç蚌æã§éèŠãªåœ¹å²ãæãããŸãã 倧ãŸãã«èšã£ãŠãã¢ã«ãŽãªãºã ã®çµæãã¢ã«ãŽãªãºã ã®æåŸã«è¡šç€ºãããå Žåãã¢ã«ãŽãªãºã ã¯ç·åœ¢åå¯èœã§ãã ããšãã°ããªã¹ããžã®æ¿å ¥ã®çµæã¯ãæ¿å ¥é¢æ°ã®æåŸã«è¡šç€ºãããŸãã ã°ãããŠããããã«æããŸããããªã¹ãã«æ¿å ¥ããã¢ã«ãŽãªãºã ãèãåºãããšãã§ããç·åœ¢åã¯ã§ããŸããã ããšãã°ããã¹ãŠã®çš®é¡ã®ãããã¡ãªã³ã°ã¯ãã®ããããã£ã®éåã«ã€ãªããå¯èœæ§ããããŸããæ¿å ¥ãã代ããã«ãæ°ããèŠçŽ ããããã¡ã«å ¥ããå¥ã®ã¹ã¬ããã«ã³ãã³ããããããã¡ããèŠçŽ ããªã¹ãã«æ¿å ¥ãããèŠçŽ ã®æ¿å ¥ãåŸ ããªãããšãã§ããŸãã ãŸãã¯ãååãªæ°ã®èŠçŽ ããããã¡ã«èç©ããããšãã«ã®ã¿æ¿å ¥ããŸãã 次ã«ããªã¹ãå ã®æ¿å ¥é¢æ°ã®æåŸã§ãèŠçŽ ããªã¹ãå ã«ããããšãä¿èšŒã§ããŸããã ä¿èšŒã§ããã®ã¯ãçŸåšãŸãã¯åŸã§ãªã¹ãã«èŠçŽ ã確å®ã«æ¿å ¥ãããããšã§ã ïŒæªæ¥åœ¢ïŒïŒã
ãããã®æŠå¿µã¯ãç 究ãããžã§ã¯ãã§åºã䜿çšãããŠããŸãã ç§ã®èšäºã¯ç 究è«æã®ãµããããŠããªãã®ã§ããå²åŠçããªæå³ã§ããã¯ããªãŒãšããçšèªã䜿çšããŠãåŸæ¥ã®åæãã¿ãŒã³ã䜿çšããã«ããŸãã¯å€éšåæãªãã§æ§ç¯ããã競åã³ã³ããã®ã¯ã©ã¹ãæããŸãã
äœè«2-æéã«ã€ããŠ
ããã¯ããªãŒã®ããŒã¿æ§é ã§ã¯ãæéã®æŠå¿µïŒåå ãšå¹æã®é¢ä¿ïŒãå€å°ãŒãããŠããããšã«æ³šæããŠãã ããã åŸæ¥ã®ã¢ãããŒãã§ã¯ã次ã®ããã«åäœããŸããã³ã³ãããžã®ã¢ã¯ã»ã¹ããããã¯ããããã«å¯ŸããŠäœããå®è¡ããŸãïŒããšãã°ãèŠçŽ ãè¿œå ããŸãïŒãããã¯ã解é€ããŸãã ããã¯è§£é€ã®æç¹ã§ãæ¿å
¥ãããã¢ã€ãã ãã³ã³ããå
ã«ããããšãããããŸãã ããã¯ããªãŒã®ã³ã³ããã§ã¯ãããã§ã¯ãããŸããã ã¢ã¯ã»ã¹ããããã¯ããå¿
èŠã¯ãããŸãããaddã¡ãœãããåŒã³åºãã ãã§ãã trueãè¿ãããå Žåãæ¿å
¥ã¯æåããŠããŸãã ããããããã¯èŠçŽ ãã³ã³ããå
ã«ããããšãæå³ãããã®ã§ã¯ãããŸãã-競åããã¹ããªãŒã ã«ãã£ãŠæ¢ã«åé€ãããŠããå¯èœæ§ããããŸãã ããã¯ãããã¯ããªãŒã³ã³ãããŒãšåŸæ¥ã®a STLã®éèŠãªéãã瀺ããŠããŸããã³ã³ãããŒå®è£
ã®å
éšãåŒãåºãããšã¯ã§ããŸããã ããšãã°ãSTLã§åºã䜿çšãããŠããã€ãã¬ãŒã¿ã®æŠå¿µã¯ã競åããããŒã¿æ§é ã«ã¯é©çšã§ããŸããã 次ã®ããããã®èšäºã§ã競åããã³ã³ããã¯ã©ã¹ã€ã³ã¿ãŒãã§ã€ã¹ã®æ§ç¯ã«ã€ããŠè©³ãã説æããããšæããŸãã
ããã¯ããªãŒã¢ã«ãŽãªãºã ã®ç¹åŸŽã¯äœã§ããïŒ ããããããªãã®ç®ãåŒãæåã®ããšã¯ããã®è€éãã§ãã åäžãªã³ã¯ãªã¹ãã«å®è£ ãããŠããéåžžã®ãã¥ãŒãäœã§ãããæ³åã§ããŸããïŒ éåžžã«ç°¡åãªã³ãŒãïŒ
éåžžã«ã·ã³ãã«ãªã³ãŒãã衚瀺ãã
struct Node { Node * m_pNext ; }; class queue { Node * m_pHead ; Node * m_pTail ; public: queue(): m_pHead( NULL ), m_pTail( NULL ) {} void enqueue( Node * p ) { p->m_pNext = m_pTail ; m_pTail = p ; if ( !m_pHead ) m_pHead = p ; } Node * dequeue() { if ( !m_pHead ) return NULL ; Node * p = m_pHead ; m_pHead = p->m_pNext ; if ( !m_pHead ) m_pTail = NULL ; return p ; } };
ããªãã¯æžãããšãã§ããããã«çãããããšãã§ããŸãã ãããŠãããã«ãå€å žçãªMichaelïŒScottããã¯ããªãŒãã¥ãŒã¢ã«ãŽãªãºã ã®ãšã³ãã¥ãŒ/ããã¥ãŒã¡ãœããïŒããã·ã¥/ãããã·ããã ïŒããããŸãïŒ[Mic96]ã®ããã«ãã³ãŒãã¯
cds::intrusive::MSQueue
ã¯ã©ã¹ã®
cds::intrusive::MSQueue
ã©ã€ãã©ãªããæå°éã®çç¥ã§ååŸãããŸããïŒïŒ
åãããã«è¡šç€ºãããŸãããéåžžã«é¢åã§ã
bool enqueue( value_type& val ) { node_type * pNew = node_traits::to_node_ptr( val ) ; typename gc::Guard guard ; back_off bkoff ; node_type * t ; while ( true ) { t = guard.protect( m_pTail, node_to_value() ) ; node_type * pNext = t->m_pNext.load(memory_model::memory_order_acquire) ; if ( pNext != null_ptr<node_type *>() ) { // Tail is misplaced, advance it m_pTail.compare_exchange_weak( t, pNext, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) ; continue ; } node_type * tmp = null_ptr<node_type *>() ; if ( t->m_pNext.compare_exchange_strong( tmp, pNew, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) { break ; } bkoff() ; } ++m_ItemCounter ; m_pTail.compare_exchange_strong( t, pNew, memory_model::memory_order_acq_rel, CDS_ATOMIC::memory_order_relaxed ); return true ; } value_type * dequeue() { node_type * pNext ; back_off bkoff ; typename gc::template GuardArray<2> guards ; node_type * h ; while ( true ) { h = guards.protect( 0, m_pHead, node_to_value() ) ; pNext = guards.protect( 1, h->m_pNext, node_to_value() ) ; if ( m_pHead.load(memory_model::memory_order_relaxed) != h ) continue ; if ( pNext == null_ptr<node_type *>() ) return NULL ; // empty queue node_type * t = m_pTail.load(memory_model::memory_order_acquire); if ( h == t ) { // It is needed to help enqueue m_pTail.compare_exchange_strong( t, pNext, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) ; continue ; } if ( m_pHead.compare_exchange_strong( h, pNext, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) { break ; } bkoff() ; } --m_ItemCounter ; dispose_node( h ) ; return pNext ; }
ã¢ã«ãŽãªãºã ã¯è€éã§ãã åãäžéãªã³ã¯ãªã¹ãã§ãããéåžžã®ãã¥ãŒãšããã¯ããªãŒãã¥ãŒã®åçŽãªèŠèŠçæ¯èŒã§ããããã§ã«äœããèšã£ãŠããŸãã ããã¯ããªãŒãã¥ãŒã«ã¯æ¬¡ã®ããã«è¡šç€ºãããŸãã
- ç¡éã«ãŒã-ããŸããããŸã§æäœãå®äºããããšããŸãã ããã¯ãã¢ãããã¯æäœ
compare_exchange
ã䜿çšããå žåçãªãã¿ãŒã³ã§ãã - ããã¯ããªãŒã¢ã«ãŽãªãºã ã§ã¡ã¢ãªïŒãã€ã³ã¿ãŒïŒã䜿çšããŠå®å
šã«äœæ¥ããæ¹æ³ã®1ã€ã䜿çšããããŒã«ã«å€æ°ïŒ
guards
ïŒã®ä¿è·ããã®å Žåã¯ããã¶ãŒããã€ã³ã¿ãŒæ³ã§ãã - ã¢ãããã¯ããªããã£ãã®é©çšC ++ 11-
load, compare_exchange
ãã¡ã¢ãªããªã¢memory_order_xxx
; - ããã¹ã¬ãããå¥ã®ã¹ã¬ãããæ©èœãããã®ã«åœ¹ç«ã€å Žåãããã¯ããªãŒã¢ã«ãŽãªãºã ã§ã¯éåžžã«äžè¬çãªããªãã¯ã§ãã
- ãªãã·ã§ã³ã®ããã¯ãªãæŠç¥ïŒ
bkoff
functorïŒã®é©çšããã ããå€ãã®ã¹ã¬ãããåæã«ãã¥ãŒã«ã¢ã¯ã»ã¹ããå Žåãå Žåã«ãã£ãŠã¯é«è² è·äžã§ããã»ããµãå€§å¹ ã«ã¢ã³ããŒãã§ããŸãã
ãããã¯ãã¹ãŠéåžžã«åºç¯å²ã«ããããããåå¥ã®è°è«ãå¿ èŠãªãããããã§ã¯èª¬æããŸããã é°è¬ãç¶ããŸãããã ä»åŸã®èšäºã§ãããã®ãããã¯ãã«ããŒããããšèããŠããŸãã
次ã®èšäºã§ã¯ããã¹ãŠã®ããã¯ããªãŒããŒã¿æ§é ã®åºç€ãšãªãåºæ¬æŠå¿µã§ããååæ§ãšååããªããã£ãã«ã€ããŠèª¬æããŸãã
ãããŠæåŸã«-æçšãªæžç±ïŒèšäºã§ã¯ãããŸããïŒãç§ã®èŠ³ç¹ããã¯ã競åããã°ã©ãã³ã°ã®åé¡ãæãå®å šã«æ±ã£ãŠããŸãã
çŸåšãŸã§ã«ãç§ã¯2ã€ã®è¯ãäœåãç¥ã£ãŠããŸãã
1. Nir ââShavitãMaurice Herlihy ããã«ãããã»ããµããã°ã©ãã³ã°ã®èžè¡ ã ç§ã®ç¥ãéãããã·ã¢èªãžã®ç¿»èš³ã¯ãããŸããã äžçã§éåžžã«æåãªããã¯ããªãŒäœå®¶ã®æ¬ã¯ãããããæ§ç¯ããããã®å€ãã®äžŠåã¢ã«ãŽãªãºã ãšæ¹æ³ã説æããŠããŸãã ãã¹ãŠã®äŸã¯Javaã§èšè¿°ãããŠãããããäœæè ã¯ã¡ã¢ãªã®è§£æŸãC ++ã¡ã¢ãªã¢ãã«ïŒJavaã§ã¯ã¡ã¢ãªã¢ãã«ã®æ¹ãå³å¯ã§ãïŒãããã³Javaã®èšèªèªäœã«åã蟌ãŸããŠãããã®ä»ã®ããšã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããã§ãã.C ++ã§ã¯ãããããã¹ãŠãèªåã§èšè¿°ããå¿ èŠããããŸãã ããã«ãããããããæ¬ã¯éåžžã«äŸ¿å©ã§ãã
2. Anthony Williams C ++ Concurrency in Action ïŒ ãã·ã¢èªã®ç¿»èš³ããããŸã ïŒã äžççã«æåãªC ++ã®èè ã®æ¬ã¯ãC ++ã§ã®ãã«ãã¹ã¬ããããã°ã©ãã³ã°ã«ç¹åããŠãããæ°ããC ++ 11æšæºãšã䞊åã¢ã«ãŽãªãºã ãå®è£ ããããã®æšæºã«ãã£ãŠæäŸãããæ°ããæ©èœã«ã€ããŠèª¬æããŠããŸãã èªãããšã匷ããå§ãããŸãã
åç §ïŒ
[Her90] M. HerlihyãJM Wing Linearizability ïŒA Concentness Condition for Concurrent Objects ãACM Transactions on Programming Languages and Systemsã1990
[Her91] M. Herlihy é«åºŠã«åæããŒã¿ãªããžã§ã¯ããå®è£ ããããã®æ¹æ³è« ã1991
[Mic96] M.ãã€ã±ã«ãMãã¹ã³ããã·ã³ãã«ãé«éãããã³å®çšçãªéããããã³ã°ããã³ããããã³ã°ã³ã³ã«ã¬ã³ããã¥ãŒã¢ã«ãŽãªãºã
ããã¯ããªãŒã®ããŒã¿æ§é
éå§ãã
åºæ¬ïŒ
äžïŒ
å€ããïŒ
åºæ¬ïŒ
- ååæ§ããã³ååããªããã£ã
- èšæ¶ã®å£ã¯ã©ãããæ¥ãã®ã§ããïŒ
- ã¡ã¢ãªã¢ãã«
äžïŒ
- ã¡ã¢ãªç®¡çã¹ããŒã
- RCU
- ã¹ã¿ãã¯ã®é²å
- å¥ã®è«æ
- ãã¥ãŒåæ
- 䞊è¡ãããïŒãŠã©ãŒã ã¢ãã
- 䞊è¡ãããïŒåããã·ã¥ãåæ§ç¯ãªã
- 䞊è¡ãããïŒãªã¹ããã¹ããã
- äžèŽãããïŒæš
- ã€ãã¬ãŒã¿ïŒãã«ãã¬ãã«é å
- å埩å¯èœãªãªã¹ã
å€ããïŒ