
opusã®åã®éšåïŒ
1ã2ã3 ïŒã§ã¯ãããã¯ããªãŒãããã®å
éšæ§é ã調ã¹ããã¹ãŠã®åºæ¬æäœïŒããŒã®æ€çŽ¢ã远å ãåé€ïŒãã°ããŒãã«ããã¯ãªãã§ãããã«ã¯ããã¯ããªãŒãªæ¹æ³ã§ãå®è¡ã§ããããšã確èªããŸããã ããããæšæºã®
std::map
ã¯ãå¥ã®éåžžã«äŸ¿å©ãªæœè±¡å-ã€ãã¬ãŒã¿ããµããŒãããŠããŸãã å埩å¯èœãªããã¯ããªãŒããããå®è£
ããããšã¯å¯èœã§ããïŒ
ãã®è³ªåãžã®çãã¯æ§ããã§ãã
äžå¹Žåãç§ã¯ååãšããŠãããã¯ããªãŒã®ã³ã³ããã«ã¯ã€ãã¬ãŒã¿ãå®è¡å¯èœã§ã¯ãªããšç¢ºä¿¡ããŠããŸããã èªåã§å€æããŠãã ããïŒã€ãã¬ãŒã¿ã䜿çšãããšãã³ã³ããã®ãã¹ãŠã®èŠçŽ ããã€ãã¹ã§ããŸãã ããããããã¯ããªãŒã®äžçã§ã¯ãã³ã³ããã®å
容ã¯åžžã«å€åããŠããã®ã§ãããã¹ãŠã®èŠçŽ ããã€ãã¹ããããšèãããããã®ã¯äœã§ããïŒ

å埩-ã³ã³ããã®èŠçŽ ãå埩åŠç-æéããããããã®éã«ã³ã³ããããããã€ãã®èŠçŽ ãåé€ãããä»ã®èŠçŽ ã远å ãããŸããããã©ããŒã¹ã®å
šæéã«ããã£ãŠã³ã³ããã«ååšããå®å®ããïŒç©ºã®å¯èœæ§ã®ããïŒèŠçŽ ã®ãµãã»ãããååšããå¿
èŠããããŸã
list.begin()
ãã
list.end()
ã ãããã«å ããŠã远å ãããèŠçŽ ã®ããã€ããšãåé€ãããèŠçŽ ã®ããã€ãããã«ãŒãã眮ããããšãã«èšªåã§ããŸãã æããã«ãããã¯ããªãŒãããå
ã®
ãã¹ãŠã®èŠçŽ ã蚪åããã¿ã¹ã¯ã¯äžå¯èœã§ããã©ãŠã³ãã®å
šæéã«ããã£ãŠã³ã³ããã®ç¶æ
ãåçµããããšã¯ã§ããŸããã ãã®ãããªåçµãšã¯ãå®éã«ã¯ãä»ã®ã¹ã¬ãããã³ã³ããã«å¯ŸããŠå€æŽæäœãå®è¡ããããšãçŠæ¢ããããšãæå³ããŸããããã¯ãããããã³ã°ãšåçã§ãã
ç©è°ãéžã声æå®éãç«¶åããã³ã³ããã®ç¶æ
ããããªãŒãºãããæè¡ããããŸãããããã¯ä»ã®ã¹ã¬ãããã³ã³ããã倿Žããã®ãé²ããŸãã-ãã®èŠçŽ ã远å /åé€ããŸãã ããããããããã®ãã¯ããã¯ã®äžã§æãæåãªã®ã¯ããŒãžã§ã³ä»ãããªãŒã§ãã äžçªäžã®è¡ã¯ãã³ã³ããã®è€æ°ã®ããŒãžã§ã³ã1ã€ã®ããªãŒã«æ ŒçŽãããããšã§ãã ãã®ãããªããªãŒã«è¿œå ãããã³ã«ãå¥ã®ããŒãžã§ã³ãçæãããŸããããã¯ãäžå€ã®ããŒããä»ã®ããŒãžã§ã³ïŒããªãŒïŒãšå
±æããç¬èªã®ã«ãŒããæã€ããªãŒã§ãã ããŒãžã§ã³ç®¡çãããããªãŒã®ã³ã³ã·ã¥ãŒããŒã¯ãããªãŒã®ææ°ããŒãžã§ã³ïŒææ°ã®ã«ãŒãïŒãååŸããããªãŒã§åäœããéããã®ããŒãžã§ã³ã¯ããªãŒã«æ®ããŸãã ããŒãžã§ã³ã«é¢é£ä»ããããŠããã³ã³ã·ã¥ãŒãã¹ããªãŒã ããªããªããšããã«ãããŒãžã§ã³ïŒã€ãŸãããã®ããŒãžã§ã³ã«å±ãããã¹ãŠã®ããŒãïŒãå®å
šã«åé€ã§ããŸãã
å¥ã®ææ³ã¯ãã¹ãããã·ã§ããããµããŒãããç«¶åã³ã³ãããŒã§ãïŒã³ã³ãããŒã¹ãããã·ã§ããïŒã ããæå³ã§ã¯ãããŒãžã§ã³ç®¡çãããã³ã³ããã«äŒŒãŠããŸãã
ãããã®ææ³ã¯äž¡æ¹ãšããããŒãžã§ã³ãŸãã¯ã¹ãããã·ã§ãããä¿åããããã®ã¡ã¢ãªæ¶è²»éã®å¢å ãããã³å
éšæ§é ããµããŒãããããã®è¿œå ã®æäœã䌎ããŸãã å€ãã®å Žåããã®ãããªæè¡ãæäŸããå©ç¹ãšæ¯èŒããŠããã®éå°ãªæ¯åºã¯ç¡èŠã§ããŸãã
ãã®èšäºã§ã¯ãåæ§ã®ææ³ã䜿çšããã«ç«¶åãã飿³ã³ã³ãããæ€èšããŸãã ã€ãŸããåé¡ã¯ããã§ãããŸãã«ãã®å
éšæ§é ã«ãããèŠçŽ ã®å®å
šãªãã€ãã¹ãå¯èœã«ãããããªç«¶äºåã®ããã³ã³ãããæ§ç¯ããããšã¯å¯èœã§ããããïŒ
ãããã£ãŠãå®å®ãããµãã»ããããã®ãã¹ãŠã®ããŒããžã®ä¿èšŒããã蚪åã¯ãç«¶åããã³ã³ããã®ãã€ãã¹ã§ãããšèããŸãã
ãç«¶åããã³ã³ããã®ãã€ãã¹ãšèŠãªããããã®ããšãã質åã«å ããŠã2ã€ã®åé¡ããããŸãã
åé¡1 ã ã€ãã¬ãŒã¿ã¯ãæ¬è³ªçã«ã³ã³ããèŠçŽ ãžã®ç¹æ®ãªãã€ã³ã¿ã§ãã ã€ãã¬ãŒã¿ã䜿çšããŠãèŠçŽ èªäœã«ã¢ã¯ã»ã¹ããŸãã ãã ããç«¶åããã³ã³ããã§ã¯ãã€ãã¬ãŒã¿ãé
眮ãããŠããèŠçŽ ã¯ãã€ã§ãåé€ã§ããŸãã ã€ãŸããã€ãã¬ãŒã¿ã¯ãã€ã§ãç¡å¹ã«ãªãå¯èœæ§ããããŸã-åé€ãããèŠçŽ ãã€ãŸããŽããæããŸãïŒ
ãã¶ãŒããã€ã³ã¿ãŒåè·¯ã«ããããã®åé¡ã®è§£æ±ºçã¯ãå®éã«ã¯ãã¶ãŒããã€ã³ã¿ãŒã§ãã HPã¹ããŒã ã§ã¯ããã€ã³ã¿ãŒãå±éºã§ãããšå®£èšãããŠããéããã€ã³ã¿ãŒïŒãã€ã³ã¿ãŒïŒãç©ççã«åé€ã§ããªããã€ãŸããã¬ããŒãž
ã«ããã£ã«ãªããªãããšãæãåºããŠãã ããã 以äžã®äŸ¿å©ãªæœè±¡åã
guarded_ptr
ä¿è·ãã€ã³ã¿ãŒãå°å
¥ããŸãã
template <typename T> struct guarded_ptr { hp_guard hp; // T * ptr; // guarded_ptr(std::atomic<T *>& p) { ptr = hp.protect( p ); } ~guarded_ptr() { hp.clear(); } T * operator ->() const { return ptr; } explicit operator bool() const { return ptr != nullptr; } };
ã芧ã®ãšããã
guarded_ptr
ã¯ãã¶ãŒããã€ã³ã¿ãŒãåããåãªããã€ã³ã¿ãŒã§ãã ãã¶ãŒããã€ã³ã¿ãŒ
hp
ã¯ã
ptr
èŠçŽ ãžã®ãã€ã³ã¿ãŒãä¿è·ããç©ççã«åé€ãããªãããã«ããŸãã ã¹ããªãŒã Bãã€ãã¬ãŒã¿ãé
眮ãããŠããèŠçŽ ãåé€ããŠãããã®èŠçŽ ã¯ã³ã³ããããé€å€ãããŸãããã€ãã¬ãŒã¿ã®ãã¶ãŒããã€ã³ã¿ã«ãã®èŠçŽ ãžã®ãªã³ã¯ãå«ãŸãããŸã§ç©ççã«åé€ãããŸããã
ãããã£ãŠãHPã¹ããŒãã§ã¯ãå埩åã¯ã©ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
template <typename T> class iterator { guarded_ptr<T> gp; public: T* operator ->() { return gp.ptr; } T& operator *() { return *gp.ptr; } iterator& operator++(); };
ãšããã¯ããŒã¹ïŒ
ãŠãŒã¶ãŒç©ºéRCUã
guarded_ptr
ãšããã¯ããŒã¹ã®ã¹ããŒã ã§ã¯ã
guarded_ptr
ã¯å¿
èŠãããŸããã1ã€ã®æä»£ã«å埩ïŒã³ã³ããã®ãã¹ãŠã®èŠçŽ ã®ãã©ããŒãµã«ïŒãå®è¡ããå¿
èŠããããŸãã
urcu.lock();
åé¡2 ïŒæ¬¡ã®é
ç®ã«é²ã¿ãŸãã

ç¹å®ã®ã¹ã¬ããBããã€ãã¬ãŒã¿ãé
眮ãããŠããèŠçŽ ïŒãã®å Žåã¯42ïŒã«ç¶ãèŠçŽ ãåé€ãããšãã€ãã¬ãŒã¿ãã€ã³ã¯ãªã¡ã³ãããæäœã¯ãåé€ãããèŠçŽ ã®åŒã³åºããã€ãŸãã¬ããŒãžã«ãªããŸãã
ãã®åé¡ã¯ãã¹ã¬ãããã³ã³ããããã€ãã¹ããŠããããšãç¥ãããèŠçŽ ãèªç±ã«åé€/远å ã§ãããããæåã®åé¡ãããè€éã§ãã ã€ãã¬ãŒã¿ãæãèŠçŽ ãäœããã®æ¹æ³ã§ããŒã¯ããèŠçŽ ãåé€ãããšãã«ãã®ãããªãã©ã°ãåæããããšãèããããšãã§ããŸãããããã¯å°ãªããšãã³ã³ããã®å
éšæ§é ãè€éã«ããŸãïŒãããŠãæå€§ã§ããã®ãããªæšè«ã¯äœã«ãã€ãªãããŸããïŒã è峿·±ãããŒã¿æ§é ãããããå¥ã®æ¹æ³ããããŸã-ãã«ãã¬ãã«é
åã
ãã«ãã¬ãã«é
å
ãã®ããŒã¿æ§é ã¯ã2013幎ã«Steve Feldmanã«ãã£ãŠ
ææ¡ããã飿³ã³ã³ãããã€ãŸãããã·ã¥ãããã§ãã

ããã·ã¥ãäžå®ã®é·ãã®ãããæååã§ãããšæ³åããŠãã ããã ãã®æååã®ãããããã«ãã¬ãã«é
åã®ã€ã³ããã¯ã¹ãšèŠãªããŸãïŒæåã®Mãããã¯ããããé
åã®ãããé
åã®ã€ã³ããã¯ã¹ã§ãïŒå³ã§ã¯M = 4ãã€ãŸãããããé
åã®ãµã€ãºã¯2 ** 4 = 16ã§ãïŒãNãããã®æ¬¡ã®éšåã¯åºç€ãšãªãããŒãé
åã®ã€ã³ããã¯ã¹ïŒå³ã§ã¯ãN = 2ã§ãããŒãé
åã®æ¬¡å
ã¯2 ** 2 = 4ã§ãïŒã é
åèŠçŽ ã«ã¯æ¬¡ã®ãã®ããããŸãã
- 空ã§ã
- ããŒã¿ãã€ã³ã¿
- 次ã®ã¬ãã«ã®é
åãžã®ãã€ã³ã¿ãŒ
空ã®ãã«ãã¬ãã«é
åã¯ããã¹ãŠã®ã»ã«ã空ã®ãããé
åã®ã¿ã§æ§æãããŸãã
次ã®ã¢ã«ãŽãªãºã ã«åŸã£ãŠããã«ãã¬ãã«é
åã®ããŒããŒã䜿çšããŠããŒã¿
data
ã远å ããŸãã
- 1.ããŒããã·ã¥ãèšç®ãã
h = hash( key )
- 2.ããã·ã¥
h
ã®æåã®MããããååŸããŸã-ããã¯ããããé
åã®i
ã»ã«ã®ã€ã³ããã¯ã¹ã§ã - 3aã ã»ã«ã空ã®å ŽåïŒ
head_array[i] == nullptr
ïŒãããŒã¿ããã®äžã«å
¥ããŸãïŒ head_array[i].CAS( nullptr, &data )
-ãããŠçµäºããŸãã ããã¯ããªãŒã®ã³ã³ãããããã®ã§ãã¢ãããã¯æäœããã®å Žåã¯CASïŒC ++ 11ã®èгç¹ã§ã¯æ¯èŒãšäº€æã std::compare_exchange
ïŒãstd::compare_exchange
ãŸãã - 3bã ã»ã«ã«ããŒã¿ãå«ãŸããå ŽåïŒ
head_array[i] = di
ïŒããããåå²ããå¿
èŠããããŸããã€ãŸããæ¬¡ã®ã¬ãã«ã®ããŒãé
åãäœæãããã®äžã«di
ãå
¥ããŠãã¹ããã4ã«é²ã¿ãŸãã - 3cã ã»ã«ã«åºã«ãªãããŒãé
åãžã®ãã€ã³ã¿ãŒãå«ãŸããŠããå Žåã¯ãæé 4ã«é²ã¿ãŸãã
- 4.çŸåšã®é
åã¯ç¹å®ã®ããŒãé
åã§ãã ããŒ
h
ããã·ã¥ã®æ¬¡ã®NããããååŸããŸãããããã®ãããã¯ãçŸåšã®ããŒãé
åã®ã€ã³ããã¯ã¹i
ã«ãªããŸãã ããã·ã¥ã®ãã¹ãŠã®ãããã䜿ãæããããå Žåãã³ã³ããã«ã¯ãã§ã«åãããã·ã¥ãæã€èŠçŽ ããããããŒã¿data
æ¿å
¥ã¯å€±æããŸãã - 4aã ã»ã«ã空ã®å ŽåïŒ
current_node_array[i] == nullptr
ïŒããã®äžã«ããŒã¿ãé
眮ããŸãïŒ current_node_array[i].CAS( nullptr, &data )
-ãããŠçµäº - 4bã ã»ã«ã«ããŒã¿ãå«ãŸããå ŽåïŒ
current_node_array[i] = di
ïŒããããåå²ããå¿
èŠããããŸããã€ãŸããæ¬¡ã®ã¬ãã«ã®ããŒãé
åãäœæãããã®äžã«di
ãå
¥ããŠãã¹ããã4ã«é²ã¿ãŸãã - 4cã ã»ã«ã«åºã«ãªãããŒãé
åãžã®ãã€ã³ã¿ãŒãå«ãŸããŠããå Žåã¯ãæé 4ã«é²ã¿ãŸãã
ã芧ã®ããã«ãæ¿å
¥ã¢ã«ãŽãªãºã ã¯éåžžã«ã·ã³ãã«ã§çŽæçã§ã-èšèã§èª¬æãããããæãæ¹ãç°¡åã§ãã åé€ã¢ã«ãŽãªãºã ã¯ããã«ç°¡åã§ãïŒåé€ãããããŒã®ããã·ã¥å€ããããæååãšããŠèæ
®ããããããéžæããŠé
åå
ã®ã€ã³ããã¯ã¹ãšããŠè§£éããã»ã«ã空ãŸãã¯ããŒã¿ãå«ãé
åãžã®ãªã³ã¯ãäžããŸãã ã»ã«ã空ã®å ŽåãããŒïŒããæ£ç¢ºã«ã¯ããã®ããã·ã¥ïŒãã³ã³ãããŒå
ã«ãªããåé€ãããã®ããªãããšãæå³ããŸãã ã»ã«ã«ããŒã¿ãå«ãŸãããã®ããŒã¿ã®ããŒãç®çã®ããŒã§ããå Žåãã¢ãããã¯CASæäœã䜿çšããŠã»ã«å€ã
nullptr
倿ŽããŸãã åé€ãããšããé
åã®ã»ã«ããŒãã«ããã ãã§ãnode_arrayèªäœã¯æ±ºããŠåé€ãããªãããšã«æ³šæããŠãã ãã-ãã®äºå®ã¯å°æ¥åœ¹ã«ç«ã€ã§ãããã
質åã¯æªè§£æ±ºã®ãŸãŸã§ããé
åã»ã«ã«å«ãŸããå
容ãåºå¥ããæ¹æ³-次ã®ã¬ãã«ã®é
åãžã®ããŒã¿ãŸãã¯ãã€ã³ã¿ãŒã éåžžã®ããã°ã©ãã³ã°ã§ã¯ãé
åã®åã¹ãããã«ããŒã«ã¿ã°ãé
眮ããŸãã
struct array_slot { union { T* data; node_array* array; }; bool is_array;
ããããç§ãã¡ã®ããã°ã©ãã³ã°ã¯ç°åžžã§ããããã®ã¢ãããŒãã¯ç§ãã¡ã«ã¯é©ããŠããªãã§ãããã ç°åžžãªããšã¯ãããŒã¿ã®é·ãã«å¶éãããã¢ãããã¯ããªããã£ãCASãæäœããå¿
èŠãããããšã§ãã ã€ãŸãã1ã€ã®CASã§ã»ã«ã®å€ãš
is_array
屿§ãã¢ãããã¯ã«å€æŽã§ããå¿
èŠããããŸãã
ããã¯ããªãŒãšããã¯ã®
åã®éšåãèªãã§ã
ããŒã¯ããããã€ã³ã¿ãŒã®ãããªãã®ãããããšãç¥ã£ãŠããã°ãããã¯åé¡ã§ã¯ãããŸããã
is_array
ãé
åã»ã«ãã€ã³ã¿ãŒã®
is_array
ãããã«ä¿åããŸãã
template <typename T> using array_slot = marked_ptr<T*, 3 >;
ãããã£ãŠãé
åã»ã«ã¯åãªããã€ã³ã¿ãŒã§ãããå
éšãã©ã°ã«ã¯æåŸã®2ãããïŒ
marked_ptr
ãã¹ã¯3ïŒã䜿çšããŸãããã»ã«ã«ã¯æ¬¡ã®ã¬ãã«ã®é
åãžã®ãã€ã³ã¿ãŒãå«ãŸããŸããèšå·ã«1ãããã... ïŒ..
æ¿å
¥ã¢ã«ãŽãªãºã ãããèŠãŠãã ããã ã¹ããã3bããã³4bã¯ãã»ã«ã®åå²ãã€ãŸããããŒã¿ãå«ãã»ã«ããåºç€ãšãªãé
åãžã®ãã€ã³ã¿ãŒãå«ãã»ã«ãžã®å€æã«ã€ããŠèª¬æããŠããŸãã ãã®ãããªå€æã¯ã以äžãå¿
èŠãšãããããéåžžã«æéãããããŸãã
- æ°ããnode_arrayãäœæããŸãã
- ãã¹ãŠã®èŠçŽ ã®ãŒãåã
- åå²ãããã»ã«ããŒã¿ã®æ°ããnode_arrayã§äœçœ®ãèŠã€ããã
- åå²ãããã»ã«ã®èŠã€ãã£ãããŒã¿äœçœ®ã«ããæ°ããnode_arrayã«æžã蟌ã¿ãŸãã
- æåŸã«ãæ°ããåå²ã»ã«å€ãèšå®ããŸã
ãããã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ãå®è¡ãããŠããéãåè£å¯èœãªã»ã«ã¯æªå®çŸ©ã®ç¶æ
ã«ãããŸãã 2çªç®ã®æäžäœãããã§ãšã³ã³ãŒãããã®ã¯ãã®ç¶æ
ã§ãã ãã»ã«ãåå²ãããŠããŸãããšãããã©ã°ãæºããããã«ãã¬ãã«ã¢ã¬ã€äžã®ãã¹ãŠã®æäœã¯ããã®ãã©ã°ã§ã¢ã¯ãã£ãã¹ãã³ã䜿çšããŠããã®ãããªã»ã«ã®åå²ãå®äºããã®ãåŸ
ã£ãŠããŸãã
å³ã§ã¯ãé»ã®ããŒã¿ã远å ãããããŒDn
ãéãæ¢åã®D
éçããŒã-ããã¯ããªãŒã³ã³ããã®éåååŠåå²ã»ã«ã«ã€ããŠããããã¹ãŠæžããŠãããšãã«ãèããæµ®äžããŸããïŒãã®ãã©ã°ã¯å¿
èŠã§ãããªããªãããã¯æ€çŽ¢æäœãå«ãä»ã®ãã¹ãŠã®ãããŒã®å転ã«ã€ãªããã®ã§ãset / mapã®ãããªã³ã³ããã«ãšã£ãŠæéã§ãªããã°ãªããŸãããïŒ ã
æäœãæ€èšããŠãã ããã äžè¬ã«ãmapã¯ãããŒã®æ€çŽ¢ãæ¿å
¥ãããã³åé€ã®3ã€ã®æäœã®ã¿ããµããŒãããŸãïŒæ®ãã®æäœã¯ããŸããŸã§ãïŒã æ€çŽ¢ã§ã¯ããã»ã«ãå岿®µéã«ããããšããäºå®ã¯çµ¶å¯Ÿã«éèŠã§ã¯ãããŸãããæ€çŽ¢ã§ã¯ãã»ã«ã®çš®é¡ã調ã¹ãå¿
èŠããããŸãã ã»ã«ã«ããŒã¿ãžã®ãã€ã³ã¿ãŒãå«ãŸããŠããå ŽåãããŒã¿ããŒãæ¢ããŠãããã®ãšæ¯èŒããå¿
èŠããããŸãïŒããŒã¿ã§ã»ã«ã«ééããããããããæååã®ãã¬ãã£ãã¯ã¹ïŒããŒãšã»ã«å
ã®ããŒã¿ã®ããã·ã¥ïŒã¯åãã§ãããã»ã«å
ã®ããŒã¿ãæ€çŽ¢ã§ããããšãæå³ããŸãïŒ ã»ã«ãé
åãžã®ãã€ã³ã¿ãŒã§ããå Žåã¯ããã®é
åã«ç§»åããŠæ€çŽ¢ãç¶ããå¿
èŠããããŸãã æ¢ããŠããããŒãã»ã«ãåå²ãããŠããããŒã¿ãã®ãã®ã§ãããšä»®å®ããŸããã€ãŸããããã¹ã¬ãããããŒKãæ¢ããå¥ã®ã¹ã¬ãããåãããŒKã®ããŒã¿ã远å ãããããåæã«çºçããç¶æ³ããããšããŸãã ããã¯åæã«çºçãããããæ€çŽ¢æäœã¯ãããŒãèŠã€ãã£ããå ŽåãšãããŒãèŠã€ãããªãã£ããå Žåã®äž¡æ¹ã§æ£ãããã®ã«ãªããŸãã æ€çŽ¢æäœã«åå²ãã©ã°ã¯å¿
èŠãªãããšãããããŸãã
æ¿å
¥æäœã æ¿å
¥ãåå²ã»ã«ã§ã€ãŸãããšãå¥ã®ã¹ããªãŒã ããçŸåšã®ã¹ããªãŒã ãšåãããŒããã·ã¥å€ã®ãã¬ãã£ãã¯ã¹ãæã€ããŒã¿ã远å ããŸãã ãã®å Žåãäž¡æ¹ã®ã¹ããªãŒã ïŒäž¡æ¹ã®æ¿å
¥æäœïŒã¯ãånode_arrayãäœæãããããåå²ã»ã«ã®å€ãšããŠèšå®ããããšããããšã«ãããäºãã«å©ãåããŸãã ã»ã«å€ã¯CASããªããã£ãã«ãã£ãŠèšå®ãããnode_arrayã¯æ±ºããŠåé€ãããªãããïŒã€ãŸããnode_arrayãžã®ãã€ã³ã¿ãŒã«ABAã®åé¡ã¯ãªãïŒãæ¿å
¥ã¹ã¬ããã®1ã€ã ããåè
ãšãªãïŒåå²ã»ã«ã®æ°ããå€ãèšå®ïŒã2çªç®ã®ã¹ã¬ããã¯ã»ã«å€ãæ€åºããŸã倿Žãããããã圌ïŒãã®2çªç®ã®ã¹ã¬ããïŒãäœæããããšããŠããnode_arrayãåé€ãã衚瀺ãããåå²ã»ã«ã®å€ã䜿çšããå¿
èŠããããŸãã ã€ãŸããåå²ãã©ã°ãæ¿å
¥ããå¿
èŠããããŸããã
åãå€ãã åé€ããåã«ãåé€ããå¿
èŠããããã®ãèŠã€ããå¿
èŠããããŸããã€ãŸãããã®æå³ã§ã®åé€ã¯æ€çŽ¢ãšåçã§ãããåå²ãã©ã°ã¯å¿
èŠãããŸããã
èæ
®ããå¿
èŠãããå¯äžã®æäœã¯ãããŒã¿ã®æŽæ°ãæŽæ°ã§ãã
ã»ã«åå²ãã©ã°ãäœåªå
床ã®ã¹ã¬ãããèšå®ããŠãã匷å¶çµäºãããå Žåãä»ã®åªå
床ã®ã¹ã¬ããã¯åå²ãå®äºãããŸã§åŸ
æ©ãããããã€ãŸãäœåªå
床ã®ã¹ã¬ãããåäœãããŸã§åŸ
æ©ãããããããã¯ã³ã³ããã®å
šäœçãªããã©ãŒãã³ã¹ã«ãšã£ãŠéåžžã«çãããšããããŸãã ãã®å Žåãåå²ãã©ã°ãåé€ãããšéåžžã«äŸ¿å©ã§ãã
ãã«ãã¬ãã«é
åã®ããŒã¿æ§é ã¯ã·ã³ãã«ã§è峿·±ããã®ã§ããããã®æ©èœïŒãæ¬ é¥ããæžãããã£ãã®ã§ãããããã§ãæ©èœã§ãïŒã¯æ¬¡ã®ãšããã§ãã
- å®å
šãªããã·ã¥ãå¿
èŠã§ãã çæ³çãªããã·ã¥é¢æ°ã¯ãä»»æã®ããŒ
k1
ããã³k2
ã«å¯ŸããŠk1 != k2
ãç°ãªãããã·ã¥å€ãäžããããã·ã¥é¢æ°h
ã§ãïŒ h(k1)!= h(k2)
ã ã€ãŸãããã«ãã¬ãã«é
åã¯è¡çªãèš±å¯ããŸããã - ç°ãªããµã€ãºã®ããŒïŒãŸãã¯ããŒããã·ã¥ïŒã¯ãµããŒããããŠããŸããã ã€ãŸããå¯å€é·ã®
std::string
ããŒã¯ãããæååãšããŠäœ¿çšã§ããŸããã
ãã ããããŒã®ãµã€ãºãäžå®ã®å ŽåïŒãŸãã¯çæ³çãªããã·ã¥é¢æ°ãããå ŽåïŒããã«ãã¬ãã«é
åã¯éåžžã«åªããããã¯ããªãŒã³ã³ãããŒã§ããIMHOã§ãã
ååãšããŠããã«ãã¬ãã«é
åãäžè¬åããŠè¡çªãªã¹ãããµããŒãããããšãã§ããŸãããã®ãããããŒã¿ã®ä»£ããã«ããã¯ã®ãªããªã¹ããè¡çªã®ãªã¹ããšããŠäœ¿çšããã ãã§ååã§ãã å¯å€é·ããŒã®å¥ã®äžè¬åïŒçãããŒã«ã¯ããããæååå
ã®ä»ã®ãã¹ãŠã®ãããããŒãã«çãããšä»®å®ããŸãã
ãããªããã¡ã³ã¿ãžãŒãããŒããšããåèªããã€ã³ããã¯ã¹ããšããåèªã«çœ®ãæããããšãè峿·±ãã§ãããã®å Žåãããã¯ããªãŒã®ãã¯ãã«ã«éåžžã«ãã䌌ããã®ãåŸãããŸãã é
åã®çŸåšã®ãµã€ãºãåå¥ã®ã¢ãããã¯å€æ°ã«æ ŒçŽããããšã«ããã push_back
ããã³pop_back
æäœãå®è¡ã§ããŸãã ãã ãã2ã€ã®ã¹ããªãŒã ãåæã«push_back
å®è¡ããå Žåã«ã®ã¿ããã°ããã®éããŒã«ãçºçpush_back
ç¶æ³ãçºçããŸããã¹ããªãŒã Aã¯ã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ãããã€ã³ããã¯ã¹j
ãååŸããŠåŒ·å¶çµäºããã¹ããªãŒã Bã¯ã€ã³ããã¯ã¹j+1
ãååŸããŠãã®ã€ã³ããã¯ã¹ã«æ£åžžã«æ¿å
¥ããŸãã ããã§ã¯ã2ïŒãŸãã¯MïŒåã®æªæ¥ç¶ã¡ã¢ãªã»ã«ã§CASãã¢ãããã¯ã«å®è¡ã§ãã2-CASåäœïŒãŸãã¯ãã®äžè¬åããã«ãCASãMCASïŒã圹ç«ã¡ãŸãã
ãã ãããã®èšäºã®ç®çäžããã«ãã¬ãã«é
åã®1ã€ã®ããããã£ãéèŠã§ããäžåºŠäœæãããããŒãé
åã¯åé€ãããŸããã ãããŠãããã匷åãªçµæãåŸãããŸãã
ãã«ãã¬ãã«é
åã¯ã¹ã¬ããã»ãŒããªã€ãã¬ãŒã¿ããµããŒãã ãããã«ããããã¯åæ¹åã€ãã¬ãŒã¿ã§ãã å®éãããŒãé
åã¯åé€ãããªããããã€ãã¬ãŒã¿ãŒã¯ããŒãé
åãžã®ãã€ã³ã¿ãŒã«å ããŠãã»ã«ãžã®ããã€ã³ã¿ãŒãã§ããããŒãé
åå
ã®ã€ã³ããã¯ã¹ã§ãã
class iterator { guarded_ptr<T> gp_; node_array* node_; int node_index_; };
ç«¶åã¹ã¬ããã¯ã€ãã¬ãŒã¿ãé
眮ãããŠããããŒã¿ãåé€ã§ãããããããã§
guarded_ptr
ãå¿
èŠã§ãã
guarded_ptr
ãç©ççãªåé€ãé²ããŸãã ã€ãã¬ãŒã¿ã¯ãã³ã³ããããåé€ãããèŠçŽ ãæãããšãã§ããããšã倿ããŸãããããã¯ãããã¯ããªãŒããŒã¿æ§é ã®ãã1ã€ã®äºæããªãããããã£ã§ãã ããããæ
éã«èãããšããã®ããããã£ã¯çè§£ã§ããŸããç«¶äºã®æ¿ããã³ã³ããã§ããçµ¶ããå€åããäžçã§ã¯ãä¿èšŒã§ããã®ã¯1ã€ã ãã§ããã€ãã¬ãŒã¿ãé
眮ããæç¹ã§ããã®ã»ã«ã«ã¯æå¹ãªããŒã¿ãå«ãŸããŠããŸããã
node_
ãžã®
node_
ãã€ã³ã¿ãŒãšãã®äžã®ã€ã³ããã¯ã¹
node_index_
ãã³ã³ãããŒã®æ¬¡ïŒãŸãã¯åïŒã®èŠçŽ ã«ç§»åããããã«ã€ãã¬ãŒã¿ãŒã§å¿
èŠã§ããã€ãŸããã³ã³ãããŒå
ã®ã€ãã¬ãŒã¿ãŒã®çŸåšã®äœçœ®ãå®éã«æ±ºå®ããŸãã
ããã·ã¥å€ã§ã¯ãªãäžå®ãµã€ãºã®ããŒãããå Žåããã«ãã¬ãã«ã®é
åãã€ãã¹ãé åºä»ããããããšã«æ³šæããã®ã¯è峿·±ãããšã§ãã
åæ¥äŒæ©å®è£
ã®è©³çްã«èå³ãããå Žåã¯ãFeldmanHashSet / Mapã¯ã©ã¹ã®
libcdsã§ç¢ºèªã§ããŸãïŒããã§ã®äž»ãªæäœã¯ãHPããŒã¹ã®SMRã®å Žåã¯
cds/intrusive/impl/feldman_hashset.h
cds/intrusive/feldman_hashset_rcu.h
ããŠãŒã¶ãŒã¹ããŒã¹RCUã®å Žåã¯
cds/intrusive/feldman_hashset_rcu.h
ã§ãïŒ ã

èŠçŽãããšãã¹ã¬ããã»ãŒããªã€ãã¬ãŒã¿ããµããŒãããç«¶åããã³ã³ããããŸã ããããããã®ã³ã³ããã®1ã€ã¯ãã«ãã¬ãã«é
åã§ãã ä»ã«ãããŸããïŒ..å€ãã®è峿·±ãããã¯ããªãŒãããã®åºç€ãšãªãå埩å¯èœãªããã¯ããªãŒãªã¹ããäœæããããšã¯å¯èœã§ããïŒ..
ãã®è³ªåã«å¯Ÿããçãã¯æ¬¡ã®èšäºã«ãããŸãã
ããã¯ããªãŒã®ããŒã¿æ§é éå§ããåºæ¬ïŒ
äžïŒ
å€ããïŒ