{"id":202190,"date":"2013-11-19T10:31:03","date_gmt":"2013-11-19T06:31:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=202190"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=202190","title":{"rendered":"<span class=\"post_title\">Lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043d\u0443\u0442\u0440\u0438. \u0421\u0445\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u044c\u044e<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/26b\/c1b\/103\/26bc1b1037a51443f9a7b13abf61d253.png\" align=\"right\"\/><br \/>  \u041a\u0430\u043a \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u0445, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f ABA-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438. \u042f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e \u044d\u0442\u0438 \u0434\u0432\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0445\u043e\u0442\u044c \u043e\u043d\u0438 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b: \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0438\u0437 \u043d\u0438\u0445.<br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0434\u0430\u043c \u043e\u0431\u0437\u043e\u0440 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043c\u043d\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 (safe memory reclamation) \u0434\u043b\u044f lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e \u0438\u043b\u0438 \u0438\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u044f \u0431\u0443\u0434\u0443 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 lock-free \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u041c\u0430\u0439\u043a\u043b\u0430-\u0421\u043a\u043e\u0442\u0442\u0430 [MS98].<\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h1>Tagged pointers<\/h1>\n<p>  \u0421\u0445\u0435\u043c\u0430 <i>\u043c\u0435\u0447\u0435\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439<\/i> (tagged pointers) \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0430 IBM \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f ABA-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. <br \/>  \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u0435, \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0438\u043c\u0443\u044e \u043f\u0430\u0440\u0443 \u0438\u0437 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0435\u0433\u043e \u0442\u0435\u0433\u0430 \u2013 32-\u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430.   <\/p>\n<pre><code class=\"cpp\">template &lt;typename T&gt; struct tagged_ptr {     T * ptr ;     unsigned int tag ;      tagged_ptr(): ptr(nullptr), tag(0) {}     tagged_ptr( T * p ): ptr(p), tag(0) {}     tagged_ptr( T * p, unsigned int n ): ptr(p), tag(n) {}      T * operator-&gt;() const { return ptr; } }; <\/code><\/pre>\n<p>  \u0422\u0435\u0433 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 CAS \u043d\u0430\u0434 \u043c\u0435\u0447\u0435\u043d\u044b\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u0438 <i>\u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/i>, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442. \u041f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 free-list. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e, \u0435\u0441\u043b\u0438 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u043c\u0443\u0441\u044f \u0432\u043e free-list, \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435: \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0443 \u043d\u0430\u0441 lock-free, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 X, \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u043c\u0435\u0447\u0435\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 X \u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043f\u043e\u043b\u044f\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 free-list \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 T, \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 T \u043f\u0440\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043e free-list \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e (\u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u2013 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u044d\u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430).<br \/>  \u0421\u0445\u0435\u043c\u0430 tagged pointer \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:   <\/p>\n<ul>\n<li>\u0421\u0445\u0435\u043c\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u0430 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 CAS \u043d\u0430\u0434 \u0434\u0432\u043e\u0439\u043d\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c (dwCAS). \u0414\u043b\u044f 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a dwCAS \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 64-\u0431\u0438\u0442\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0430 \u0432\u0441\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 64-\u0431\u0438\u0442\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u041d\u043e \u0434\u043b\u044f 64-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 128-\u0431\u0438\u0442\u043d\u044b\u0439 (\u0438\u043b\u0438, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, 96-\u0431\u0438\u0442\u043d\u044b\u0439) dwCAS, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043d\u0435 \u043d\u0430 \u0432\u0441\u0435\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u0445.<br \/> \n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u0430 \u0432\u044b \u0435\u0440\u0443\u043d\u0434\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438, \u0431\u0430\u0442\u0435\u043d\u044c\u043a\u0430!<\/b><\/p>\n<div class=\"spoiler_text\">\u041e\u0441\u043e\u0431\u043e \u0438\u0441\u043a\u0443\u0448\u0435\u043d\u043d\u044b\u0435 \u0432 lock-free \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u0440\u0430\u0437\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 tagged pointers \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u0438\u0439 128-\u0431\u0438\u0442\u043d\u044b\u0439 (\u0438\u043b\u0438 96-\u0431\u0438\u0442\u043d\u044b\u0439) CAS. \u041c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c 64-\u0431\u0438\u0442\u043d\u044b\u043c, \u0435\u0441\u043b\u0438 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e 48 \u0431\u0438\u0442 \u0434\u043b\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438, \u0441\u0442\u0430\u0440\u0448\u0438\u0435 16 \u0431\u0438\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b \u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430-\u0442\u0435\u0433\u0430. \u0427\u0442\u043e \u0436, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u043e\u0433\u0443\u0442. \u0422\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 <code>boost.lockfree<\/code>.<br \/>  \u0412 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u00ab\u043d\u043e\u00bb:  <\/p>\n<ul>\n<li>\u041a\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u0438 \u0441\u0442\u0430\u0440\u0448\u0438\u0435 16 \u0431\u0438\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u044b? \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0440\u044b\u0432 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0447\u0438\u043f\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0435\u0451 \u043e\u0431\u044a\u0435\u043c \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0435\u0442 \u0441\u043a\u0430\u0447\u043a\u043e\u043c \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u2014 \u0432\u0435\u043d\u0434\u043e\u0440\u044b \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u043f\u0443\u0441\u0442\u044f\u0442 \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u0441 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e 64-\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439<\/li>\n<li>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438 16 \u0431\u0438\u0442 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u0433\u0430? \u041d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0435\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044d\u0442\u0438\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 \u0442\u0430\u043a\u043e\u0432: 16 \u0431\u0438\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044e ABA-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0410 \u0432\u043e\u0442 32 \u0431\u0438\u0442\u0430 \u2013 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. <br \/>  \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, 16 \u0431\u0438\u0442 \u2013 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u0433\u0430 0 \u2013 65535. \u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043a\u0432\u0430\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043e\u0442\u0432\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u043f\u043e\u0442\u043e\u043a\u0443, \u043f\u043e\u0440\u044f\u0434\u043a\u0430 300 \u2013 500 \u0442\u044b\u0441\u044f\u0447 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 (\u0432\u0437\u044f\u0442\u043e \u0438\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 linux), \u0438 \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u044d\u0442\u043e\u0442 \u043a\u0432\u0430\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0441\u0442\u0438. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0437\u0430 \u043e\u0434\u0438\u043d \u043a\u0432\u0430\u043d\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c 65 \u0442\u044b\u0441\u044f\u0447 \u0434\u0430\u0436\u0435 \u0442\u0430\u043a\u0438\u0445 \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u0430\u043a CAS (\u043d\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u0436\u0435 \u0437\u0430\u0432\u0442\u0440\u0430). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u0438 16-\u0431\u0438\u0442\u043e\u0432\u043e\u043c \u0442\u0435\u0433\u0435 \u043c\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0438\u0441\u043a\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c ABA-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/li>\n<\/ul>\n<p>  <\/div>\n<\/div>\n<p>  <\/li>\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f free-list \u2013 \u044d\u0442\u043e lock-free \u0441\u0442\u0435\u043a \u0438\u043b\u0438 lock-free \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0447\u0442\u043e \u0432\u043d\u043e\u0441\u0438\u0442 \u0441\u0432\u043e\u0439 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c: \u0435\u0449\u0451 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0432\u044b\u0437\u043e\u0432\u0443 CAS \u043f\u0440\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 free-list \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0432 \u043d\u0435\u0433\u043e. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043d\u0430\u043b\u0438\u0447\u0438\u0435 free-list \u043c\u043e\u0436\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a, \u0435\u0441\u043b\u0438 free-list \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439, \u0442\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c, \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438.<\/li>\n<li>\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e free-list \u0434\u043b\u044f <i>\u043a\u0430\u0436\u0434\u043e\u0433\u043e<\/i> \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u043e\u0441\u043a\u043e\u0448\u044c\u044e \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 lock-free \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 10 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u043e \u0432 \u043f\u0438\u043a\u0435 \u0435\u0451 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c 1 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430, \u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 free-list \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0438\u043a\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u043a\u043e\u043b\u043e 1 \u043c\u043b\u043d. \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e.<\/li>\n<\/ul>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u0445\u0435\u043c\u0430 tagged pointer \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u0440\u0435\u0448\u0430\u044e\u0449\u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e ABA-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0438 \u043d\u0435 \u0440\u0435\u0448\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 <i>\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f<\/i> \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"http:\/\/libcds.sourceforge.net\/\">libcds<\/a> \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 tagged pointers \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443, \u044d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u043c\u0443 \u0440\u043e\u0441\u0442\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u0437-\u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f free-list \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0412 libcds \u044f \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u0441 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u0431\u0435\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f dwCAS. <br \/>  \u0425\u043e\u0440\u043e\u0448\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b tagged pointers \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>boost.lockfree<\/code>.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f tagged pointers<\/h2>\n<p>  \u041b\u044e\u0431\u0438\u0442\u0435\u043b\u044f\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043d\u0435\u0439 (\u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u044b\u0435 \u043d\u0430\u0439\u0434\u0443\u0442\u0441\u044f) \u2014 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 <code>MSQueue<\/code> [MS98] \u0441 tagged pointer. \u0414\u0430, lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b!<br \/>  \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u044f \u043e\u043f\u0443\u0441\u0442\u0438\u043b \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 <code>std:atomic<\/code>.  <\/p>\n<pre><code class=\"cpp\">template &lt;typename T&gt; struct node {     tagged_ptr next;     T data; } ;  template &lt;typename T&gt; class MSQueue {    tagged_ptr&lt;T&gt; volatile m_Head;    tagged_ptr&lt;T&gt; volatile m_Tail;     FreeList m_FreeList; public:    MSQueue()    {      \/\/ \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c dummy node      \/\/ Head & Tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 dummy node      m_Head.ptr = m_Tail.ptr = new node();    }  void enqueue( T const& value )  { E1: node * pNode = m_FreeList.newNode(); E2: pNode\u2013&gt;data = value; E3: pNode\u2013&gt;next.ptr = nullptr; E4: for (;;) { E5:   tagged_ptr&lt;T&gt; tail = m_Tail; E6:   tagged_ptr&lt;T&gt; next = tail.ptr\u2013&gt;next; E7:   if tail == Q\u2013&gt;Tail {          \/\/ Tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442? E8:      if next.ptr == nullptr {             \/\/ \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043f\u0438\u0441\u043a\u0430 E9:         if CAS(&tail.ptr\u2013&gt;next, next, tagged_ptr&lt;T&gt;(node, next.tag+1)) {               \/\/ \u0423\u0441\u043f\u0435\u0445, \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 E10:          break;             } E11:     } else {             \/\/ Tail \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442             \/\/ \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c tail \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 E12:        CAS(&m_Tail, tail, tagged_ptr&lt;T&gt;(next.ptr, tail.tag+1));          }       }     } \/\/ end loop     \/\/ \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c tail \u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 E13: CAS(&m_Tail, tail, tagged_ptr&lt;T&gt;(pNode, tail.tag+1));  }  bool dequeue( T& dest ) { D1:  for (;;) { D2:    tagged_ptr&lt;T&gt; head = m_Head; D3:    tagged_ptr&lt;T&gt; tail = m_Tail; D4:    tagged_ptr&lt;T&gt; next = head\u2013&gt;next;        \/\/ Head, tail \u0438 next \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b? D5:    if ( head == m_Head ) {           \/\/ Queue \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 tail \u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439? D6:       if ( head.ptr == tail.ptr ) {             \/\/ \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430? D7:         if (next.ptr == nullptr ) {                \/\/ \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430 D8: \t         return false;             }             \/\/ Tail \u043d\u0435 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435             \/\/ \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c tail D9:         CAS(&m_Tail, tail, tagged_ptr&lt;T&gt;(next.ptr, tail.tag+1&gt;));  D10:      } else { \/\/ Tail\u043d\u0430 \u043c\u0435\u0441\u0442\u0435             \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 CAS, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0430\u0447\u0435              \/\/ \u0434\u0440\u0443\u0433\u043e\u0439 dequeue \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c next D11:        dest = next.ptr\u2013&gt;data;             \/\/ \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c head D12:        if (CAS(&m_Head, head, tagged_ptr&lt;T&gt;(next.ptr, head.tag+1)) D13:           break \/\/ \u0423\u0441\u043f\u0435\u0445, \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0446\u0438\u043a\u043b\u0430           }        }      } \/\/ end of loop      \/\/ \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0439 dummy node  D14: m_FreeList.add(head.ptr); D15: return true; \/\/ \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2013 \u0432 dest   } <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/aa8\/a2f\/260\/aa8a2f26019d7ef75d3fd450ee39c16f.jpg\" align=\"right\"\/><br \/>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 enqueue \u0438 dequeue. \u041d\u0430 \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u0435\u043c\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440.<\/p>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043e\u0431\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0446\u0438\u043a\u043b\u044b \u2013 \u0432\u0441\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e (\u043b\u0438\u0431\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>dequeue<\/code> \u0438\u0437 \u043f\u0443\u0441\u0442\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438). \u0422\u0430\u043a\u0430\u044f \u00ab\u0434\u043e\u043b\u0431\u0435\u0436\u043a\u0430\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0446\u0438\u043a\u043b\u0430 \u2013 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u0435\u043c lock-free \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 <code>m_Head<\/code>) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0438\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (dummy node). \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0438\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u043c, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0432\u043d\u044b <code>NULL<\/code>. \u041f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u043c \u043f\u0443\u0441\u0442\u043e\u0442\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u0435 <code>m_Head == m_Tail && m_Tail-&gt;next == NULL<\/code> (\u0441\u0442\u0440\u043e\u043a\u0438 D6-D8). \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 (<code>m_Tail-&gt;next == NULL<\/code>) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043c\u044b <i>\u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c<\/i> <code>m_Tail<\/code>, \u2014 \u0441\u0442\u0440\u043e\u043a\u0430 E9 \u043b\u0438\u0448\u044c \u043c\u0435\u043d\u044f\u0435\u0442 <code>m_Tail-&gt;next<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043c\u0435\u0442\u043e\u0434 <code>enqueue<\/code> \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u0430 <code>m_Tail<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0438\/\u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435: \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <code>enqueue<\/code> \u043f\u0435\u0440\u0435\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 (\u0441\u0442\u0440\u043e\u043a\u0430 E8), \u0447\u0442\u043e <code>m_Tail<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (\u0442\u043e \u0435\u0441\u0442\u044c <code>m_Tail-&gt;next == NULL<\/code>), \u0438 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043a\u043e\u043d\u0435\u0446 (\u0441\u0442\u0440\u043e\u043a\u0430 E12); \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <code>dequeue<\/code> \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u0432\u043e\u0438\u0445 \u00ab\u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u0435\u0439\u00bb \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 <code>m_Tail<\/code>, \u0435\u0441\u043b\u0438 \u043e\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u043d\u0430 \u043a\u043e\u043d\u0435\u0446 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (\u0441\u0442\u0440\u043e\u043a\u0430 D9). \u042d\u0442\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u043c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 lock-free \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u2014 \u0432\u0437\u0430\u0438\u043c\u043e\u043f\u043e\u043c\u043e\u0449\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (<i>helping<\/i>): \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u0440\u0430\u0437\u043c\u0430\u0437\u0430\u043d\u043d\u044b\u043c\u00bb \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u043e\u0434\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0435\u0451 \u0440\u0430\u0431\u043e\u0442\u0443 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u0440\u0443\u0433\u043e\u0439) \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e) \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435.<\/p>\n<p>  \u0415\u0449\u0451 \u043e\u0434\u043d\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435: \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b (\u0441\u0442\u0440\u043e\u043a\u0438 E5-E6, D2-D4). \u0417\u0430\u0442\u0435\u043c (\u0441\u0442\u0440\u043e\u043a\u0438 E7, D5) \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430\u043c\u0438 \u2014 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u0435\u043c lock-free, \u0438\u0437\u043b\u0438\u0448\u043d\u0438\u0439 \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: \u0437\u0430 \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0435 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f. \u0427\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u00ab\u0443\u043c\u043d\u044b\u0439\u00bb \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0438 \u0432\u043e\u0432\u0441\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f E7 \u0438\u043b\u0438 D5), <code>m_Head<\/code> \u0438 <code>m_Tail<\/code> \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b \u0432 C++11 \u043a\u0430\u043a <code>atomic<\/code> (\u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0435 \u2013 <code>volatile<\/code>). \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e CAS-\u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u0441\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c, \u0438 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0440\u0430\u0432\u043d\u044b, \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u043d\u0430 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f CAS-\u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f; \u0432\u044b\u0437\u043e\u0432 <code>CAS(&val, val, newVal)<\/code> \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u043c <i>\u043f\u043e\u0447\u0442\u0438<\/i> \u0432\u0441\u0435\u0433\u0434\u0430, \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, <i>\u043a\u043e\u0433\u0434\u0430<\/i> \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>dequeue<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0441\u0442\u0440\u043e\u043a\u0430 D11): <i>\u043f\u0435\u0440\u0435\u0434<\/i> \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (\u0441\u0442\u0440\u043e\u043a\u0430 D12). \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 <code>m_Head<\/code> \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 D12) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u043c, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 (D11) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u044b\u043c. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f C++, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438, \u0438\u043d\u0430\u0447\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 D11 \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a\u0438. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430 CAS. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u00ab\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u044b\u043d\u043e\u0441\u043e\u043c \u0441\u0442\u0440\u043e\u043a\u0438 D11 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0446\u0438\u043a\u043b\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>next<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c. \u0422\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 tagged pointer, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f, \u0442\u043e \u0442\u0430\u043a\u0430\u044f \u00ab\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u00bb \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u0442\u044c <i>\u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435<\/i> \u0434\u0430\u043d\u043d\u044b\u0435 (\u043d\u0435 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438 D12).  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c M&amp;S-\u043e\u0447\u0435\u0440\u0435\u0434\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\u0412\u043e\u043e\u0431\u0449\u0435, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c <code>MSQueue<\/code> \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0442\u0435\u043c, \u0447\u0442\u043e <code>m_Head<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 dummy node, \u0430 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430 <code>m_Head<\/code> \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u041f\u0440\u0438 <code>dequeue<\/code> \u0438\u0437 \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0442\u043e \u0435\u0441\u0442\u044c <code>m_Head.next<\/code>, dummy-\u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f, \u0430 \u043d\u043e\u0432\u044b\u043c dummy-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c (\u0438 \u043d\u043e\u0432\u043e\u0439 \u0433\u043e\u043b\u043e\u0432\u043e\u0439) \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e <i>\u043f\u043e\u0441\u043b\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/i> <code>dequeue<\/code>.<br \/>  \u042d\u0442\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0445\u043b\u043e\u043f\u043e\u0442, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0440\u0443\u0437\u0438\u0432\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 <code>cds::intrusive::MSQueue<\/code>.  <\/div>\n<\/div>\n<h2>Epoch-based reclamation<\/h2>\n<p>  \u0424\u0440\u0430\u0437\u0435\u0440 [Fra03] \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0441\u0445\u0435\u043c\u0443, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043d\u0430 <i>\u044d\u043f\u043e\u0445\u0430\u0445<\/i>. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u0430\u044f \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u042d\u0442\u0443 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 <i>\u044d\u043f\u043e\u0445\u0438<\/i>: \u0435\u0441\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u043f\u043e\u0445\u0430 <code>nGlobalEpoch<\/code>, \u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u044d\u043f\u043e\u0445\u0435 <code>nThreadEpoch<\/code>. \u041f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0432 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u043c\u044b\u0439 epoch-based \u0441\u0445\u0435\u043c\u043e\u0439 \u043a\u043e\u0434 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u043f\u043e\u0445\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u044d\u043f\u043e\u0445\u0443. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u044d\u043f\u043e\u0445\u0438, <code>nGlobalEpoch<\/code> \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u041f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0441\u0445\u0435\u043c\u044b:  <\/p>\n<pre><code class=\"cpp\"> \/\/ \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u043f\u043e\u0445\u0430 static atomic&lt;unsigned int&gt; m_nGlobalEpoch := 1 ;  const EPOCH_COUNT = 3 ;  \/\/ TLS data struct ThreadEpoch {     \/\/ \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u043f\u043e\u0445\u0430 \u043f\u043e\u0442\u043e\u043a\u0430     unsigned int\tm_nThreadEpoch ;     \/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432     List&lt;void *&gt;\tm_arrRetired[ EPOCH_COUNT ] ;          ThreadEpoch(): m_nThreadEpoch(1) {}      void enter() {        if ( m_nThreadEpoch &lt;= m_nGlobalEpoch )           m_nThreadEpoch = m_nGlobalEpoch + 1 ;     }      void exit() {        if ( \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u044d\u043f\u043e\u0445\u0435, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0437\u0430 m_nGlobalEpoch ) {           ++m_nGlobalEpoch ;            \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c (delete) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b            m_arrRetired[ (m_nGlobalEpoch \u2013 2) % EPOCH_COUNT ]           \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 ;        }     } } ; <\/code><\/pre>\n<p>  \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0445 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 <code>m_arrRetired[m_nThreadEpoch % EPOCH_COUNT]<\/code>. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u044d\u043f\u043e\u0445\u0443 <code>m_nGlobalEpoch<\/code>, \u0432\u0441\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u044d\u043f\u043e\u0445\u0438 <code>m_nGlobalEpoch \u2013 1<\/code> \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0442\u044c, \u0430 \u0441\u0430\u043c\u0443 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u044d\u043f\u043e\u0445\u0443 \u2014 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. <\/p>\n<p>  \u041a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432 \u0432\u044b\u0437\u043e\u0432\u044b <code>ThreadEpoch::enter()<\/code> \u0438 <code>ThreadEpoch::exit()<\/code>, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e:  <\/p>\n<pre><code class=\"cpp\">lock_free_op( \u2026 ) {     get_current_thread()-&gt;ThreadEpoch.enter() ;     . . .     \/\/ lock-free \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.      \/\/ \u041c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u201c\u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438\u201d epoch-based \u0441\u0445\u0435\u043c\u044b,     \/\/ \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u043c \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438     \/\/ \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c.     . . .     get_current_thread()-&gt;ThreadEpoch.exit() ; } <\/code><\/pre>\n<p>  \u0421\u0445\u0435\u043c\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430) \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u0417\u0430\u0449\u0438\u0442\u0443 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a (\u0438\u0437\u0432\u043d\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430) \u0441\u0445\u0435\u043c\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e epoch based-\u0441\u0445\u0435\u043c\u044b \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c. \u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e <i>\u0432\u0441\u0435<\/i> \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u044d\u043f\u043e\u0445\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043a\u0430\u043a\u043e\u043c\u0443-\u043b\u0438\u0431\u043e lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443; \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u044d\u043f\u043e\u0445\u0443, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432, \u043d\u0438\u0437\u043a\u043e\u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0432\u043b\u0435\u0447\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0439 \u0440\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, epoch-based \u0441\u0445\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 (\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0440\u0430\u0445\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u2013 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442) \u043a \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0440\u0430\u0441\u0445\u043e\u0434\u0443 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libcds \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 epoch-based \u0441\u0445\u0435\u043c\u044b. \u041f\u0440\u0438\u0447\u0438\u043d\u0430: \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0432\u0441\u0435 \u043b\u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u044d\u043f\u043e\u0445\u0438. \u0411\u044b\u0442\u044c \u043c\u043e\u0436\u0435\u0442, \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435?..<\/p>\n<h2>Hazard pointer<\/h2>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/927\/aba\/0b1\/927aba0b1bfcb77049461c406eddb737.jpg\" align=\"right\"\/><br \/>  \u0421\u0445\u0435\u043c\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0430 \u041c\u0430\u0439\u043a\u043b\u043e\u043c [Mic02a, Mic03] \u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b <i>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445<\/i> \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0438 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u043e\u0439 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f. \u041e\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u0447\u0442\u0435\u043d\u0438\u0438 \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u00ab\u0442\u044f\u0436\u0435\u043b\u044b\u0435\u00bb \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 CAS.<br \/>  \u041a\u0440\u0430\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u043c \u043a\u0430\u043c\u043d\u0435\u043c \u0441\u0445\u0435\u043c\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043a\u0430\u043a <i>hazard<\/i> (\u043e\u043f\u0430\u0441\u043d\u044b\u0435) \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043c\u044b \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>HP<\/code> hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u041c\u0430\u0441\u0441\u0438\u0432 <code>HP<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430: \u043f\u0438\u0448\u0435\u0442 \u0432 \u043d\u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a-\u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446, \u0447\u0438\u0442\u0430\u0442\u044c \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 (\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 <code>Scan<\/code>). \u0415\u0441\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>HP<\/code> (\u0447\u0438\u0441\u043b\u043e hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430) \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 3 \u2013 4, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u0445\u0435\u043c\u044b \u043d\u0435\u0432\u0435\u043b\u0438\u043a\u0438.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0413\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\u0421\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u0440\u0430\u0434\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u0435\u00bb \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u0441\u0432\u044b\u0448\u0435 64 hazard pointer\u2019\u043e\u0432. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 skip-list (<code>cds::container::SkipListMap<\/code>) \u2013 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e \u0441\u0443\u0442\u0438, \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u043e\u0439 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0422\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0441\u0445\u0435\u043c\u044b Hazard Pointer, \u0445\u043e\u0442\u044f \u0432 libcds \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f skip-list \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u044b.  <\/div>\n<\/div>\n<p>  \u041f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0441\u0445\u0435\u043c\u044b Hazard Pointers [Mic02]:  <\/p>\n<pre><code class=\"cpp\">\/\/ \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \/\/ P : \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \/\/ K : \u0447\u0438\u0441\u043b\u043e hazard pointer \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \/\/ N : \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e hazard pointers = K*P \/\/ R : batch size, R-N=\u03a9(N), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, R=2*N  \/\/ Per-thread \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:  \/\/ \u041c\u0430\u0441\u0441\u0438\u0432 Hazard Pouinter \u043f\u043e\u0442\u043e\u043a\u0430 \/\/ \u041f\u0438\u0448\u0435\u0442 \u0432 \u043d\u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a-\u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \/\/ \u0447\u0438\u0442\u0430\u044e\u0442 \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 void * HP[N]  \/\/ \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 dlist (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 0..R) unsigned dcount = 0;   \/\/ \u043c\u0430\u0441\u0441\u0438\u0432 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 void* dlist[R];   \/\/ \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \/\/ \u041f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 dlist void RetireNode( void * node ) {    dlist[dcount++] = node;   \/\/ \u0415\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u2013 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e Scan   if (dcount == R)      Scan(); }  \/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \/\/ \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 dlist, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b  \/\/ \u043a\u0430\u043a Hazard Pointer void Scan() {     unsigned i;    unsigned p=0;    unsigned new_dcount = 0; \/\/ 0 .. N    void * hptr, plist[N], new_dlist[N];     \/\/ Stage 1 \u2013 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0432\u0441\u0435\u043c HP \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432    \/\/ \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 plist \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439    for (unsigned t=0; t &lt; P; ++t) {       void ** pHPThread = get_thread_data(t)-&gt;HP ;       for (i = 0; i &lt; N; ++i) {          hptr = pHPThread[i];          if ( hptr != nullptr )             plist[p++] = hptr;       }    }     \/\/ Stage 2 \u2013 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 hazard pointer'\u043e\u0432    \/\/ \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430    sort(plist);     \/\/ Stage 3 \u2013 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u043a hazard    for ( i = 0; i &lt; R; ++i ) {       \/\/ \u0415\u0441\u043b\u0438 dlist[i] \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 plist \u0432\u0441\u0435\u0445 Hazard Pointer\u2019\u043e\u0432       \/\/ \u0442\u043e dlist[i] \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d       if ( binary_search(dlist[i], plist))          new_dlist[new_dcount++] = dlist[i];       else          free(dlist[i]);    }     \/\/ Stage 4 \u2013 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.    for (i = 0; i &lt; new_dcount; ++i )        dlist[i] = new_dlist[i];     dcount = new_dcount; } <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 <code>RetireNode(pNode)<\/code> \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <code>pNode<\/code> lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043f\u043e\u0442\u043e\u043a <code>j<\/code> \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 <code>pNode<\/code> \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 (\u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 <code>j<\/code>) \u0441\u043f\u0438\u0441\u043e\u043a <code>dlist<\/code> \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 (\u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0430 <code>dlist<\/code> \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 <b>R<\/b> (<b>R<\/b> \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u043e \u0441 <code>N = P*K<\/code>, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 <b>N<\/b>; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>R = 2N<\/code>), \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code>Scan()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0423\u0441\u043b\u043e\u0432\u0438\u0435 <code>R &gt; P*K<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c: \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e <code>Scan()<\/code> \u0441\u043c\u043e\u0436\u0435\u0442 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u043e, <code>Scan()<\/code> \u043c\u043e\u0436\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u2013 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d, \u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<p>  <code>Scan()<\/code> \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0441\u0442\u0430\u0434\u0438\u0439.   <\/p>\n<ul>\n<li>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 <code>plist<\/code> \u0442\u0435\u043a\u0443\u0449\u0438\u0445 hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0442 <code>null<\/code> hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u043c\u0430\u0441\u0441\u0438\u0432\u044b <code>HP<\/code> \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u2014 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0430\u0434\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/li>\n<li>\u0421\u0442\u0430\u0434\u0438\u044f 2 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 <code>plist<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0438\u0441\u043a; \u0437\u0434\u0435\u0441\u044c \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 <code>plist<\/code> \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b-\u0434\u0443\u0431\u043b\u0438.<\/li>\n<li>\u0421\u0442\u0430\u0434\u0438\u044f 3 \u2013 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>dlist<\/code> \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>dlist[i]<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <code>plist<\/code> (\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u043e\u0442\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u044d\u0442\u0438\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c, \u043e\u0431\u044a\u044f\u0432\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a hazard pointer), \u0435\u0433\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u0438 \u043e\u043d \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432 <code>dlist<\/code> (\u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0432 <code>new_dlist<\/code>). \u0418\u043d\u0430\u0447\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>dlist[i]<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d \u2013 \u043d\u0438 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043d\u0438\u043c.<\/li>\n<li>\u0421\u0442\u0430\u0434\u0438\u044f 4 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u043d\u0435\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 <code>new_dlist<\/code> \u0432 <code>dlist<\/code>. \u0422\u0430\u043a \u043a\u0430\u043a <code>R &gt; N<\/code>, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code>Scan()<\/code> \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>dlist<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u044b.<\/li>\n<\/ul>\n<p>  \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u043a Hazard Pointer, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code class=\"cpp\">std::atomic&lt;T *&gt; atomicPtr ; \u2026 T * localPtr ; do {     localPtr = atomicPtr.load(std::memory_order_relaxed);     HP[i] = localPtr ; } while ( localPtr != atomicPtr.load(std::memory_order_acquire)); <\/code><\/pre>\n<p>  \u041c\u044b \u0447\u0438\u0442\u0430\u0435\u043c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c <code>atomicPtr<\/code> \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>localPtr<\/code> (\u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0442\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c) \u0438 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 <code>HP[i]<\/code> \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>HP<\/code> hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u0430 \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u043a\u0430 \u043c\u044b \u0447\u0438\u0442\u0430\u043b\u0438 <code>atomicPtr<\/code>, \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u044b \u0432\u043d\u043e\u0432\u044c \u0447\u0438\u0442\u0430\u0435\u043c <code>atomicPtr<\/code> \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441 \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>localPtr<\/code>. \u0422\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>HP<\/code> \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0435 (\u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u043a hazard) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>atomicPtr<\/code>. \u041f\u043e\u043a\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 Hazard Pointer\u2019\u043e\u0432 (\u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043a\u0430\u043a hazard), \u043e\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d \u043d\u0438\u043a\u0430\u043a\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u043d\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0447\u0442\u0435\u043d\u0438\u044e \u043c\u0443\u0441\u043e\u0440\u0430 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>  \u0421\u0445\u0435\u043c\u0430 Hazard Pointer (HP-\u0441\u0445\u0435\u043c\u0430) \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 C++11 \u0438 memory ordering \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 [Tor08].  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">MSQueue \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 Hazard Pointer<\/b><\/p>\n<div class=\"spoiler_text\">Lock-free \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u041c\u0430\u0439\u043a\u043b\u0430-\u0421\u043a\u043e\u0442\u0442\u0430 [MS98] \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 Hazard Pointer. \u0417\u0434\u0435\u0441\u044c \u044f \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u201c\u0447\u0438\u0441\u0442\u044b\u0439\u201d \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434, \u0431\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 libcds:  <\/p>\n<pre><code class=\"cpp\">template &lt;typename T&gt; class MSQueue {     struct node {         std::atomic&lt;node *&gt;  next ;         T data;          node(): next(nullptr) {}         node( T const& v): next(nullptr), data(v) {}     };     std::atomic&lt;node *&gt; m_Head;     std::atomic&lt;node *&gt; m_Tail;  public:     MSQueue()     {         node * p = new node;         m_Head.store( p, std::memory_order_release );         m_Tail.store( p, std::memory_order_release );     }      void enqueue( T const& data )     {        node * pNew = new node( data );        while (true) {  \t    node * t = m_Tail.load(std::memory_order_relaxed);            \/\/ \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u043a hazard. HP \u2013 thread-private \u043c\u0430\u0441\u0441\u0438\u0432  \t    HP[0] = t;\t\t           \/\/ \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e m_Tail \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f! \t    if (t != m_Tail.load(std::memory_order_acquire) continue;\t\t\t\t\t            node * next = t-&gt;next.load(std::memory_order_acquire); \t    if (t != m_Tail) continue; \t    if (next != nullptr) {                \/\/ m_Tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442  \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442               \/\/ \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u043c m_Tail  \t        m_Tail.compare_exchange_weak(                 t, next, std::memory_order_release);  \t        continue;           }            node * tmp = nullptr;           if ( t-&gt;next.compare_exchange_strong(                tmp, pNew, std::memory_order_release))               break;        }        m_Tail.compare_exchange_strong( t, pNew, std::memory_order_acq_rel );        HP[0] = nullptr; \/\/ \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c hazard pointer     }      bool dequeue(T& dest)      {         while true {  \t    node * h = m_Head.load(std::memory_order_relaxed);           \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Hazard Pointer \t    HP[0] = h;           \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e m_Head \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f  \t    if (h != m_Head.load(std::memory_order_acquire)) continue;  \t    node * t = m_Tail.load(std::memory_order_relaxed); \t    node * next = h-&gt;next.load(std::memory_order_acquire);            \/\/ head-&gt;next \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0430\u0435\u043c \u043a\u0430\u043a Hazard Pointer \t    HP[1] = next;            \/\/ \u0415\u0441\u043b\u0438 m_Head \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u2013 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u0430\u043d\u043e\u0432\u043e \t    if (h != m_Head.load(std::memory_order_relaxed))             continue;            if (next == nullptr) {               \/\/ \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430 \t       HP[0] = nullptr;  \t       return false;  \t    }            if (h == t) {              \/\/ \u041f\u043e\u043c\u043e\u0433\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0443 enqueue \u2013 \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u043c m_Tail \t      m_Tail.compare_exchange_strong( t, next,                    std::memory_order_release);              continue; \t    }            dest = next-&gt;data; \t    if ( m_Head.compare_exchange_strong(h, next,                        std::memory_order_release))              break;        }        \/\/ \u041e\u0431\u043d\u0443\u043b\u044f\u0435\u043c Hazard Pointers        HP[0] = nullptr;         HP[1] = nullptr;        \/\/ \u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u0442\u0430\u0440\u0443\u044e \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432        \/\/ \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445.        RetireNode(h);      } }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u0445\u0435\u043c\u0430 Hazard Pointer \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0439? \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u0430 \u043b\u0438 \u043e\u043d\u0430 \u0434\u043b\u044f <i>\u0432\u0441\u0435\u0445<\/i> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445? \u0412 \u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u043a\u0430\u043a \u043e\u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0437\u0434\u0435\u0441\u044c, \u2014 \u043d\u0435\u0442. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0430: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e hazard pointer\u2019\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 <b>K<\/b>. \u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u044d\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u2013 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e hazard pointer \u2013 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u043f\u0440\u0438\u0447\u0435\u043c, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e, \u0447\u0438\u0441\u043b\u043e hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e. \u041d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0430\u043f\u0440\u0438\u043e\u0440\u0438 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u041f\u0440\u0438\u043c\u0435\u0440 \u2013 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0425\u0430\u0440\u0440\u0438\u0441\u0430 [Har01]. \u0412 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 HP-\u0441\u0445\u0435\u043c\u0443 \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0439.<br \/>  \u0421\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, HP-\u0441\u0445\u0435\u043c\u0443 <i>\u043c\u043e\u0436\u043d\u043e<\/i> \u043e\u0431\u043e\u0431\u0449\u0438\u0442\u044c \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u0421\u0430\u043c \u0430\u0432\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041d\u043e \u044f \u0432 libcds \u0440\u0435\u0448\u0438\u043b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c, \u0434\u0430\u0431\u044b \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u0438, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u043d\u0435 \u0443\u0442\u044f\u0436\u0435\u043b\u044f\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e HP-\u0441\u0445\u0435\u043c\u044b. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u0430\u044f, \u043c\u0435\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u2014 <i>Pass the Buck<\/i>, \u2014 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 Hazard Pointer, \u043d\u043e \u0433\u0434\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u043b \u0437\u0430\u043b\u043e\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u041e \u043d\u0435\u0439 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u043e\u0437\u0436\u0435.<\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Hazard Pointer \u0432 libcds<\/h3>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage3\/7a0\/4c3\/cb2\/7a04c3cb2cae3f8ccb8443d828f8acc7.png\"\/><\/p>\n<p>  \u042d\u0442\u043e\u0442 \u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 hazard pointer \u0432 libcds. \u042f\u0434\u0440\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u2013 <i>Hazard Pointer Manager<\/i> \u2014 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d, \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u044b\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 libcds.dll\/.so. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u043c\u0435\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <i>Thread HP Manager<\/i>, \u2014 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0430\u0441\u0441\u0438\u0432 HP hazard pointer\u2019\u043e\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 <b>K<\/b> \u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 (\u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445) \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 <i>Retired<\/i> \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c <b>R<\/b>. \u0412\u0441\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <i>Thread HP Manager<\/i> \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a. \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0440\u0430\u0432\u043d\u043e <b>P<\/b>. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 libcds:  <\/p>\n<ul>\n<li>\u0420\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 <code>K = 8<\/code><\/li>\n<li>\u0427\u0438\u0441\u043b\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 <code>P = 100<\/code><\/li>\n<li>\u0420\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 (\u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e) \u0434\u0430\u043d\u043d\u044b\u0445 <code>R = 2 * K * P = 1600<\/code>.<\/li>\n<\/ul>\n<p>  \u0412 libcds HP-\u0441\u0445\u0435\u043c\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0442\u0440\u0435\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439:  <\/p>\n<ul>\n<li><i>\u042f\u0434\u0440\u043e<\/i> \u2013 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0430\u044f \u043e\u0442 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b (\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d <code>cds::gc::hzp<\/code>). \u0422\u0430\u043a \u043a\u0430\u043a \u044f\u0434\u0440\u043e \u043d\u0435 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e (\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0438\u043f\u0430 <code>T<\/code> \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445), \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u0438\u043f\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0434\u0435\u0441\u044c \u0443\u0442\u0435\u0440\u044f\u043d\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0434\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u00ab\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u00bb \u2013 \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0438\u043d\u0442\u0440\u0443\u0437\u0438\u0432\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u2013 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430-\u0434\u0438\u0441\u043f\u043e\u0437\u0435\u0440\u0430, \u043f\u043e \u0441\u0443\u0442\u0438 \u2013 \u0432\u043e\u0437\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u00ab\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u044b\u00bb. \u0427\u0442\u043e \u0437\u0430 \u044d\u0442\u0438\u043c \u0441\u0442\u043e\u0438\u0442, \u043a\u0430\u043a\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u2013 \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c).<\/li>\n<li><i>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/i> \u2013 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d <code>cds::gc::hzp<\/code>. \u042d\u0442\u043e\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0445 (template) \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440-\u043e\u0431\u043e\u043b\u043e\u0447\u0435\u043a \u044f\u0434\u0440\u0430, \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 (\u0447\u0435\u043c-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 type erasure). \u0414\u0430\u043d\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445<\/li>\n<li><i>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c (API)<\/i> \u2013 \u043a\u043b\u0430\u0441\u0441 <code>cds::gc::HP<\/code>. \u042d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c (\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f) \u0432 lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 libcds, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u043e\u0434\u043d\u043e \u0438\u0437, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0445\u0435\u043c\u044b) \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>GC<\/code> \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043a\u043b\u0430\u0441\u0441 <code>cds::gc::HP<\/code> \u2013 \u044d\u0442\u043e \u0442\u043e\u043d\u043a\u0430\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u0443\u0440\u043e\u0432\u043d\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0435\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043c\u0435\u043b\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432.<\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0442\u0435\u0440\u044f\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\u0415\u0441\u043b\u0438 \u043c\u044b \u0432 \u044f\u0434\u0440\u0435 \u00ab\u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438\u00bb \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e \u043a\u0430\u043a \u0436\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u0442\u043e\u0447\u043d\u0435\u0435, \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430? \u041e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e: \u0432 \u044f\u0434\u0440\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e (\u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445, retired) \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434:  <\/p>\n<pre><code class=\"cpp\">struct retired_ptr {    typedef void (* fnDisposer )( void * );     void *  ptr ; \/\/ \u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c    fnDisposer pDisposer; \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f-\u0434\u0438\u0441\u043f\u043e\u0437\u0435\u0440     retired_ptr( void * p, fnDisposer d): ptr(p), pDisposer(d) {} }; <\/code><\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 (<i>retired<\/i>) \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0435\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f. \u041c\u0435\u0442\u043e\u0434 <code>Scan()<\/code> HP-\u0441\u0445\u0435\u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>pDisposer(ptr)<\/code> \u0434\u043b\u044f \u00ab\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\u00bb \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<br \/>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>pDisposer<\/code> \u0437\u043d\u0430\u0435\u0442 \u0442\u0438\u043f \u0441\u0432\u043e\u0435\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0417\u0430 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043e \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cpp\">template &lt;typename T&gt; struct make_disposer {     static void dispose( void * p ) { delete reinterpret_cast&lt;T *&gt;(p); } };  template &lt;typename T&gt; void retire_ptr( T * p ) {     \/\/ \u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c p \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 arrRetired \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445     \/\/ \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e arrRetired \u2013 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0430     arrRetired.push( retired_ptr( p, make_disposer&lt;T&gt;::dispose ));      \/\/ \u0415\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u2013 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c scan     if ( arrRetired.full() )        scan(); } <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043d\u043e \u0441\u0443\u0442\u044c, \u044f \u0434\u0443\u043c\u0430\u044e, \u044f\u0441\u043d\u0430.  <\/div>\n<\/div>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043d\u0430 \u0431\u0430\u0437\u0435 HP-\u0441\u0445\u0435\u043c\u044b \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libcds, \u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0432 <code>main()<\/code> \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 <code>cds::gc::HP<\/code> \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 HP-\u0441\u0445\u0435\u043c\u0435, \u043a\u0430\u043a \u044f \u043e\u043f\u0438\u0441\u0430\u043b \u0432 <a href=\"http:\/\/habrahabr.ru\/company\/ifree\/blog\/196834\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u0414\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u043b\u043e, \u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 <code>cds::gc::HP<\/code>. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c API HP-\u0441\u0445\u0435\u043c\u044b.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">API \u043a\u043b\u0430\u0441\u0441\u0430 cds::gc::HP<\/b><\/p>\n<div class=\"spoiler_text\">\u0412\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 <code>cds::gc::HP<\/code> \u2013 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435, \u0447\u0442\u043e \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u043e\u043c.  <\/p>\n<ul>\n<li>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440<br \/> \n<pre><code class=\"cpp\">HP(size_t nHazardPtrCount = 0,     size_t nMaxThreadCount = 0,     size_t nMaxRetiredPtrCount = 0,              cds::gc::hzp::scan_type nScanType = cds::gc::hzp::inplace); <\/code><\/pre>\n<p>  <code>nHazardPtrCount<\/code> \u2013 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e hazard pointer\u2019\u043e\u0432 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 <b>K<\/b> \u0441\u0445\u0435\u043c\u044b)<br \/>  <code>nMaxThreadCount<\/code> \u2013 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 <b>P<\/b> \u0441\u0445\u0435\u043c\u044b)<br \/>  <code>nMaxRetiredPtrCount<\/code> \u2013 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u0430 retired-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 <code>R = 2KP<\/code> \u0441\u0445\u0435\u043c\u044b)<br \/>  <code>nScanType<\/code> \u2013 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>cds::gc::hzp::classic<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 <code>Scan<\/code>; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>cds::gc::hzp::inplace<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0432 <code>Scan()<\/code> \u043e\u0442 \u043c\u0430\u0441\u0438\u0432\u0430 <code>new_dlist<\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e <code>dlist<\/code> (\u043e\u043d \u0432\u0435\u0434\u044c \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c\u0441\u044f).<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 <code>cds::gc::HP<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044f\u0434\u0440\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0434\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <code>cds::gc::HP<\/code> \u043d\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0434\u0432\u0443\u0445 \u0441\u0445\u0435\u043c Hazard Pointer, \u0430 \u043b\u0438\u0448\u044c \u043a \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0447\u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e, \u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e.  <\/li>\n<li>\u041f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 retired (\u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435) \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430<br \/> \n<pre><code class=\"cpp\">template &lt;class Disposer, typename T&gt; static void retire( T * p ) ; template &lt;typename T&gt; static void retire( T * p, void (* pFunc)(T *) ) <\/code><\/pre>\n<p>  \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>Disposer<\/code> (\u0438\u043b\u0438 <code>pFunc<\/code>) \u0437\u0430\u0434\u0430\u044e\u0442 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f (\u0434\u0438\u0441\u043f\u043e\u0437\u0435\u0440). \u0412\u044b\u0437\u043e\u0432 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u044b\u0447\u0443\u0440\u043d\u044b\u0439:  <\/p>\n<pre><code class=\"cpp\">struct Foo { \u2026 }; struct fooDisposer {    void operator()( Foo * p ) const { delete p; } };  \/\/ \u0412\u044b\u0437\u043e\u0432 \u0434\u0438\u0441\u043f\u043e\u0437\u0435\u0440\u0430 myDisposer \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 Foo Foo * p = new Foo ; cds::gc::HP::retire&lt;fooDisposer&gt;( p ); <\/code><\/pre>\n<p>  <\/li>\n<li>\n<pre><code class=\"cpp\">static void force_dispose(); <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 <code>Scan()<\/code> \u0441\u0445\u0435\u043c\u044b Hazard Pointer. \u041d\u0435 \u0437\u043d\u0430\u044e, \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438, \u043d\u043e \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 libcds \u044d\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e.  <\/li>\n<\/ul>\n<p>  \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>cds::gc::HP<\/code> \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b \u0442\u0440\u0438 \u0432\u0430\u0436\u043d\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0430:  <\/p>\n<ul>\n<li><code>thread_gc<\/code> \u2013 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u043e\u0434\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (thread data), \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0445\u0441\u044f \u043a \u0441\u0445\u0435\u043c\u0435 Hazard Pointer. \u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 HP-\u0441\u0445\u0435\u043c\u044b \u043a \u043f\u043e\u0442\u043e\u043a\u0443, \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043e\u0442 \u0441\u0445\u0435\u043c\u044b<\/li>\n<li><code>Guard<\/code> \u2013 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e hazard pointer<\/li>\n<li><code>template &lt;size_t Count&gt; GuardArray<\/code> \u2013 \u043c\u0430\u0441\u0441\u0438\u0432 hazard pointer\u2019\u043e\u0432. \u041f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 HP-\u0441\u0445\u0435\u043c\u044b \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0441\u0440\u0430\u0437\u0443. \u0411\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043e\u0434\u043d\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c, \u0430 \u043d\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 <code>Guard<\/code><\/li>\n<\/ul>\n<p>  \u041a\u043b\u0430\u0441\u0441\u044b <code>Guard<\/code> \u0438 <code>GuardArray&lt;N&gt;<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043d\u0430\u0434 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c Hazard Pointer, \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430. \u041e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430.<\/p>\n<p>  \u041a\u043b\u0430\u0441\u0441 <code>Guard<\/code> \u0441\u0443\u0442\u044c hazard-\u0441\u043b\u043e\u0442 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 API:  <\/p>\n<ul>\n<li>\n<pre><code class=\"cpp\">template &lt;typename T&gt; T protect( CDS_ATOMIC::atomic&lt;T&gt; const& toGuard );  template &lt;typename T, class Func&gt; T protect( CDS_ATOMIC::atomic&lt;T&gt; const& toGuard, Func f ); <\/code><\/pre>\n<p>  \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f (\u0442\u0438\u043f <code>T<\/code> \u2013 \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c) \u043a\u0430\u043a hazard. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441\u043a\u0440\u044b\u0442 \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0440\u0430\u043d\u0435\u0435: \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f <code>toGuard<\/code>, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f hazard pointer\u2019\u0443 \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f.<br \/>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 (\u0441 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c <code>Func<\/code>) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u0430\u043a hazard \u043d\u0435 \u0441\u0430\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>T *<\/code>, \u0430 \u043d\u0435\u043a\u0438\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043e\u0442 \u043d\u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. \u042d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 \u0438\u043d\u0442\u0440\u0443\u0437\u0438\u0432\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043d\u0430 \u0443\u0437\u0435\u043b (node), \u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442 \u043d\u0435\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>node<\/code> \u043c\u043e\u0436\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f <i>\u043f\u043e\u043b\u0435\u043c<\/i> \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445). \u0424\u0443\u043d\u043a\u0442\u043e\u0440 <code>Func<\/code> \u0438\u043c\u0435\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443:  <\/p>\n<pre><code class=\"cpp\">struct functor {    value_type * operator()( T * p ) ; }; <\/code><\/pre>\n<p>  \u041e\u0431\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d\u0438 \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u043a\u0430\u043a hazard.  <\/li>\n<li>\n<pre><code class=\"cpp\">template &lt;typename T&gt;  T * assign( T * p );  template &lt;typename T, int Bitmask&gt; T * assign( cds::details::marked_ptr&lt;T, Bitmask&gt; p ); <\/code><\/pre>\n<p>  \u042d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c p \u043a\u0430\u043a hazard. \u0417\u0434\u0435\u0441\u044c, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 <code>protect<\/code>, \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430, \u2014 <code>p<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 hazard-\u0441\u043b\u043e\u0442.<br \/>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f <i>\u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445<\/i> \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 <code>cds::details::marked_ptr<\/code>. \u0412 marked-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u043b\u0430\u0434\u0448\u0438\u0435 2-3 \u0431\u0438\u0442\u0430 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 0 \u043d\u0430 \u0432\u044b\u0440\u0430\u0432\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445) \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432, \u2014 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u0435\u043c \u0432 lock-free \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0432 hazard-\u0441\u043b\u043e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441 \u043e\u0431\u043d\u0443\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0431\u0438\u0442\u0430\u043c\u0438 \u0444\u043b\u0430\u0433\u043e\u0432 (\u043f\u043e \u043c\u0430\u0441\u043a\u0435 <code>Bitmask<\/code>).<br \/>  \u041c\u0435\u0442\u043e\u0434\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d\u0438 \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u043a\u0430\u043a hazard.  <\/li>\n<li>\n<pre><code class=\"cpp\">template &lt;typename T&gt; T * get() const; <\/code><\/pre>\n<p>  \u0427\u0438\u0442\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e hazard-\u0441\u043b\u043e\u0442\u0430. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u043e.  <\/li>\n<li>\n<pre><code class=\"cpp\">void copy( Guard const& src ); <\/code><\/pre>\n<p>  \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 hazard-\u0441\u043b\u043e\u0442\u0430 \u0438\u0437 <code>src<\/code> \u0432 <code>this<\/code>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0434\u0432\u0430 hazard-\u0441\u043b\u043e\u0442\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.  <\/li>\n<li>\n<pre><code class=\"cpp\">void clear(); <\/code><\/pre>\n<p>  \u041e\u0431\u043d\u0443\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f hazard-\u0441\u043b\u043e\u0442\u0430. \u0422\u043e \u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <code>Guard<\/code>.  <\/li>\n<\/ul>\n<p>  \u041a\u043b\u0430\u0441\u0441 <code>GuardArray<\/code> \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c API, \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0449\u0451 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435:  <\/p>\n<pre><code class=\"cpp\">template &lt;typename T&gt; T protect(size_t nIndex, CDS_ATOMIC::atomic&lt;T&gt; const& toGuard );  template &lt;typename T, class Func&gt; T protect(size_t nIndex, CDS_ATOMIC::atomic&lt;T&gt; const& toGuard, Func f )  template &lt;typename T&gt; T * assign( size_t nIndex, T * p );  template &lt;typename T, int Bitmask&gt; T * assign( size_t nIndex, cds::details::marked_ptr&lt;T, Bitmask&gt; p );  void copy( size_t nDestIndex, size_t nSrcIndex );  void copy( size_t nIndex, Guard const& src );  template &lt;typename T&gt; T * get( size_t nIndex) const;  void clear( size_t nIndex); <\/code><\/pre>\n<p>  \u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u0438\u0442 \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0435 <code>CDS_ATOMIC<\/code> \u2013 \u0447\u0442\u043e \u044d\u0442\u043e? <br \/>  \u042d\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441, \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d \u0434\u043b\u044f <code>std::atomic<\/code>. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 (\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442) C++11 <code>atomic<\/code>, \u0442\u043e <code>CDS_ATOMIC<\/code> \u0435\u0441\u0442\u044c <code>std<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u2013 \u044d\u0442\u043e <code>cds::cxx11_atomics<\/code>, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 libcds-\u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u044b \u0434\u043b\u044f atomic. \u0412 \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 libcds \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>boost.atomic<\/code>, \u0442\u043e\u0433\u0434\u0430 <code>CDS_ATOMIC<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e <code>boost<\/code>.  <\/div>\n<\/div>\n<h1>Hazard Pointer with Reference Counter<\/h1>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage3\/036\/678\/6e4\/0366786e4530108f26e3ae9b8551bbad.jpg\" align=\"right\"\/><br \/>  \u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c \u0441\u0445\u0435\u043c\u044b Hazard Pointer \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0443\u0437\u043b\u044b lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u043e\u043d\u0430 \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442: \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0441\u044f \u0431\u044b \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0423\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435<\/b><\/p>\n<div class=\"spoiler_text\">\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e HP-\u0441\u0445\u0435\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442-\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 HP-\u0441\u043b\u043e\u0442, \u0437\u0430\u0449\u0438\u0449\u0430\u044e\u0449\u0438\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043a \u043f\u043e\u0442\u043e\u043a\u0443 (\u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e hazard-\u0441\u043b\u043e\u0442\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430). \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u044d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434, \u0447\u0442\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e HP-\u0441\u0445\u0435\u043c\u044b \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  \u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0440\u0435\u0432\u043d\u0435\u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0430\u0442\u0443\u044f \u00ab\u0421\u0430\u043c\u0441\u043e\u043d, \u043f\u043e\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u0434\u0443\u0431\u0438\u043d\u043e\u0439 \u0411\u0430\u0433\u0430, \u043f\u043e\u043a\u0440\u043e\u0432\u0438\u0442\u0435\u043b\u044f \u0433\u043e\u0432\u043d\u043e\u043a\u043e\u0434\u0430\u00bb. \u0414\u0440\u0435\u0432\u043d\u0435\u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0441\u0447\u0438\u0442\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a \u2014 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0442 \u0432\u0441\u0435\u0445 \u043e\u0448\u0438\u0431\u043e\u043a. \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u0440\u0435\u0432\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u0430\u043b\u0438\u0441\u044c.  <\/div>\n<\/div>\n<p>  \u0421\u0430\u043c\u044b\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 (reference counting, RefCount). \u0412 \u0440\u0430\u0431\u043e\u0442\u0430\u0445 Valois \u2013 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043f\u0438\u043e\u043d\u0435\u0440\u043e\u0432 lock-free \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0445\u0435\u043c\u0430 \u043d\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041d\u043e RefCount-\u0441\u0445\u0435\u043c\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u2013 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0430\u044e\u0442 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c RefCount-\u0441\u0445\u0435\u043c\u044b, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0451 lock-free \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b fetch-and-add (\u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u0435\u0440\u0435\u0434 <i>\u043a\u0430\u0436\u0434\u044b\u043c<\/i> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043d\u0435\u0433\u043e, \u0430 \u043f\u043e\u0441\u043b\u0435 \u2013 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c).<br \/>  \u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 \u0413\u0451\u0442\u0435\u0431\u043e\u0440\u0433\u0430 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0430 \u0432 2005 \u0433\u043e\u0434\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 [GPST05], \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0442\u043e\u0434\u044b Hazard Pointer \u0438 RefCount \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b: \u0441\u0445\u0435\u043c\u0430 Hazard Pointers \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u0449\u0438\u0442\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0441\u0445\u0435\u043c\u0430 RefCount \u2013 \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u0437\u043e\u0432\u0435\u043c \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u044d\u0442\u0443 \u0441\u0445\u0435\u043c\u0443 HRC (Hazard pointer RefCounting). <br \/>  \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 Hazard Pointers \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \/ \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u0438 \u0437\u0430\u0449\u0438\u0442\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c RefCounting-\u0441\u0445\u0435\u043c\u044b \u0432 \u043e\u0431\u0449\u0435\u043c. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043b\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b (\u0438\u0437-\u0437\u0430 \u043e\u0431\u0438\u043b\u0438\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u044f \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u0435\u0451 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434, \u0441\u043c. [GPST05]). \u0415\u0441\u043b\u0438 \u0441\u0445\u0435\u043c\u0430 Hazard Pointers \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0430\u043c\u0438\u0445 <i>\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<\/i> lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0442\u043e HRC \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u0432\u0443\u0445 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432:   <\/p>\n<pre><code class=\"cpp\">void CleanUpNode( Node * pNode); void TerminateNode( Node * pNode); <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code>TerminateNode<\/code> \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <code>pNode<\/code> \u0432\u0441\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code>CleanUpNode<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>pNode<\/code> \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u00ab\u0436\u0438\u0432\u044b\u0435\u00bb (\u043d\u0435 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0437\u043c\u0435\u043d\u044f\u044f (\u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u044f) \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438; \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u0432 RefCount-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0441\u0441\u044b\u043b\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0441\u044b\u043b\u0430\u0435\u043c\u0441\u044f, \u0442\u043e <code>CleanUpNode<\/code> \u0435\u0449\u0451 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0441\u0441\u044b\u043b\u043e\u043a \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:  <\/p>\n<pre><code class=\"cpp\">void CleanUpNode(Node * pNode) {     for (all x where pNode-&gt;link[x] of node is reference-counted) {     retry:         node1 = DeRefLink(&pNode-&gt;link[x]);  \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 HP         if (node1 != NULL and !is_deleted( node1 )) {             node2 = DeRefLink(node1-&gt;link[x]); \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 HP              \/\/ \u041c\u0435\u043d\u044f\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0438 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a             \/\/ \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 node1             CompareAndSwapRef(&pNode-&gt;link[x],node1,node2);              ReleaseRef(node2);\t\/\/ \u043e\u0447\u0438\u0449\u0430\u0435\u0442 HP             ReleaseRef(node1);\t\/\/ \u043e\u0447\u0438\u0449\u0430\u0435\u0442 HP             goto retry; \/\/ \u043d\u043e\u0432\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0436\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c         }         ReleaseRef(node1);\t\/\/ \u043e\u0447\u0438\u0449\u0430\u0435\u0442 HP     } } <\/code><\/pre>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0430\u043a\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0443 \u0430\u043a\u0446\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0438\u0437 \u044f\u0434\u0440\u0430 \u0441\u0445\u0435\u043c\u044b \u043d\u0430 \u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0447\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 C++) \u0441\u0430\u043c\u043e \u044f\u0434\u0440\u043e \u0441\u0445\u0435\u043c\u044b HRC \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u043e\u0439 lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u043e\u0434\u043d\u0430\u043a\u043e, \u0447\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c <code>CleanUpNode<\/code> \u043c\u043e\u0436\u0435\u0442 \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0440\u043e\u0447\u043d\u043e \u043d\u0430\u0440\u0443\u0448\u0438\u0442\u044c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <i>\u043f\u043e \u043e\u0434\u043d\u043e\u0439<\/i>, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043d\u0435\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e. \u0414\u043b\u044f lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0430\u043a\u043e\u0435 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0443\u044e \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044e MultiCAS \u0434\u043b\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0441\u0432\u044f\u0437\u0435\u0439 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435.<br \/>  \u0422\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f Hazard Pointers \u0441\u0445\u0435\u043c\u044b, \u0447\u0438\u0441\u043b\u043e \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u0441\u0432\u0435\u0440\u0445\u0443. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c <code>Scan<\/code> \u0441\u0445\u0435\u043c\u044b Hazar Pointers (\u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0441\u0441\u044b\u043b\u043e\u043a \u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>CleanUpNode<\/code>). \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c: \u0435\u0441\u043b\u0438 \u0432 \u0441\u0445\u0435\u043c\u0435 Hazard Pointers \u043d\u0430\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f (\u0432\u044b\u0431\u043e\u0440\u043e\u043c <code>R &gt; N = P * K<\/code>), \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code>Scan<\/code> \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c (\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043d\u0435 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0439 hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c), \u0442\u043e \u0432 \u0441\u0445\u0435\u043c\u0435 HRC \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b <code>Scan<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u043c \u0438\u0437-\u0437\u0430 \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430 (\u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u2013 \u044d\u0442\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430). \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0443\u0434\u0430\u0447\u0438 <code>Scan<\/code>, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code>CleanUpAll<\/code>: \u043e\u043d\u0430 \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u0442 \u043f\u043e \u0432\u0441\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 <code>CleanUpNode<\/code>, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0434\u0435\u043b\u0430\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>Scan<\/code>.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f HRC-\u0441\u0445\u0435\u043c\u044b \u0432 libcds<\/b><\/p>\n<div class=\"spoiler_text\">\u0412 libcds HRC-\u0441\u0445\u0435\u043c\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 HP-\u0441\u0445\u0435\u043c\u043e\u0439. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u2013 <code>cds::gc::HRC<\/code>. API \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d API <code>cds::gc::HP<\/code>. \u0414\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 namespace <code>cds::gc::hrc<\/code>.<br \/>  \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e HRC-\u0441\u0445\u0435\u043c\u044b \u2013 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u043f\u043b\u043e\u0442\u0438\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u2013 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 libcds. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u043a lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c. \u0418\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u043d\u043e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0438 <i>\u043f\u043e\u043b\u043d\u044b\u0439<\/i> \u043e\u0431\u0445\u043e\u0434 \u0432\u0441\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u2013 \u043f\u043e\u043b\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u2013 \u0432 lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e: \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0439\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a-\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442, \u0443\u0434\u0430\u043b\u044f\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u043e\u043b\u044f\u043c \u0443\u0437\u043b\u0430 \u043c\u043e\u0436\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u0437\u0435\u043b \u0437\u0430\u0449\u0438\u0449\u0435\u043d HP-\u0441\u0445\u0435\u043c\u043e\u0439 \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d, \u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u2014 \u0443\u0437\u0435\u043b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0436\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d \u0438\u0437 lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<br \/>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, HRC-\u0441\u0445\u0435\u043c\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 libcds \u043a\u0430\u043a \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 HP-\u0441\u0445\u0435\u043c\u044b. \u041d\u0430 \u0435\u0451 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 (\u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0441\u0441\u044b\u043b\u043e\u043a) \u0443\u0442\u044f\u0436\u0435\u043b\u044f\u0435\u0442 HP-\u0441\u0445\u0435\u043c\u0443: \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 HRC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 2-3 \u0440\u0430\u0437\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0439, \u0447\u0435\u043c HP-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440. \u041f\u043b\u044e\u0441 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u00ab\u043f\u043e\u0434\u0432\u0438\u0441\u0430\u043d\u0438\u044f\u00bb, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430\u043c \u043c\u0443\u0441\u043e\u0440\u0430: \u043f\u0440\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0432 \u0432\u044b\u0437\u043e\u0432\u0435 <code>Scan<\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437-\u0437\u0430 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a) \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u044f\u0436\u0435\u043b\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code>CleanUpAll<\/code>, \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u044e\u0449\u0430\u044f \u043f\u043e \u0432\u0441\u0435\u043c retired-\u0443\u0437\u043b\u0430\u043c.<br \/>  \u0422\u0430\u043a \u0447\u0442\u043e HRC-\u0441\u0445\u0435\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 libcds \u043a\u0430\u043a \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c HP-like \u0441\u0445\u0435\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043e\u0431 \u043e\u0431\u0449\u043d\u043e\u0441\u0442\u0438. \u0412 \u0441\u0438\u043b\u0443 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f HRC-\u0441\u0445\u0435\u043c\u044b \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u0435 HRC-based \u0438 HP-based \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443.  <\/div>\n<\/div>\n<h1>Pass the Buck<\/h1>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage3\/879\/42b\/ca6\/87942bca66df25ea999b60b4c7a8b302.jpg\" align=\"right\"\/><br \/>  \u0420\u0430\u0431\u043e\u0442\u0430\u044f \u043d\u0430\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, Herlihy &#038; al \u0438\u0437\u043e\u0431\u0440\u0435\u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c <i>Pass-the-Buck<\/i> (PTB, \u0438\u0434\u0438\u043e\u043c\u0430 \u201c\u0441\u0432\u0430\u043b\u0438\u0442\u044c \u0432\u0438\u043d\u0443\u201d) [HLM02, HLM05], \u043f\u043e \u0441\u0443\u0442\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 HP-\u0441\u0445\u0435\u043c\u0443 \u041c.\u041c\u0430\u0439\u043a\u043b\u0430, \u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<br \/>  \u0422\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0432 HP-\u0441\u0445\u0435\u043c\u0435, PTB-\u0441\u0445\u0435\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u043c (guarded, \u0430\u043d\u0430\u043b\u043e\u0433 hazard pointer \u0432 HP-\u0441\u0445\u0435\u043c\u0435). PTB-\u0441\u0445\u0435\u043c\u0430 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a\u043e\u0432 (\u0442\u043e \u0435\u0441\u0442\u044c hazard pointer\u2019\u043e\u0432). \u041f\u0440\u0438 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e (retired) \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code>Liberate<\/code> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 <code>Scan<\/code> \u0432 HP-\u0441\u0445\u0435\u043c\u0435. <code>Liberate<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 HP-\u0441\u0445\u0435\u043c\u044b, \u0433\u0434\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 retired-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430, \u0432 PTB-\u0441\u0445\u0435\u043c\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u044b\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<br \/>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 guard\u2019\u0430 (hazard pointer\u2019\u0430): \u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u043c\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043d\u043e \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 retired-\u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 <i>hand-off<\/i> (\u201c\u0440\u0443\u043a\u0438 \u043f\u0440\u043e\u0447\u044c\u201d). \u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code>Liberate<\/code> \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0435\u043a\u0438\u0435 retired-\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043e\u0431\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b guard\u2019\u043e\u043c, \u043e\u043d\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u044d\u0442\u0443 retired-\u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0441\u043b\u043e\u0442 hand-off guard\u2019\u0430. \u041f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>Liberate<\/code> hand-off \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u044b, \u0435\u0441\u043b\u0438 guard, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d\u0438 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u044b, \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>  \u0410\u0432\u0442\u043e\u0440\u044b \u0432 [HLM05] \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u0434\u0432\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043b\u044f <code>Liberate<\/code>: wait-free \u0438 lock-free. Wait-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 dwCAS (CAS \u043d\u0430\u0434 \u0434\u0432\u043e\u0439\u043d\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c), \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u043c \u043e\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 dwCAS \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435. Lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 (guard&#8217;\u044b \u0438 retired-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438) \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 lock-free \u0432\u0435\u0440\u0441\u0438\u0438 <code>Liberate<\/code>, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u043d\u0438\u0435 (\u0442\u043e\u0447\u043d\u0435\u0435, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u0443\u0434\u0430\u043b\u0438\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 retired-\u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0449\u0451 \u0438 \u0435\u0449\u0451). \u0421\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 PTB-\u0441\u0445\u0435\u043c\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0438\u0441\u0442\u043a\u0430, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>Liberate<\/code>.<\/p>\n<p>  \u0418\u0437\u0440\u044f\u0434\u043d\u043e \u043f\u043e\u043c\u0443\u0447\u0438\u0432\u0448\u0438\u0441\u044c \u0432 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0441 \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u043d\u0438\u0435\u043c, \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c <code>Liberate<\/code> PTB-\u0441\u0445\u0435\u043c\u044b, \u0441\u0434\u0435\u043b\u0430\u0432 \u0435\u0433\u043e \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 HP-\u0441\u0445\u0435\u043c\u043e\u0439. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f PTB \u0432 libcds \u0441\u0442\u0430\u043b\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0435\u0439 \u043d\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 HP-\u0441\u0445\u0435\u043c\u044b \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c hazard-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0435\u0434\u0438\u043d\u044b\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c retired-\u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043b\u0430\u0431\u043e: \u00ab\u0447\u0438\u0441\u0442\u0430\u044f\u00bb HP-\u0441\u0445\u0435\u043c\u0430 \u0432\u0441\u0435 \u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c PTB, \u043d\u043e PTB \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e guard&#8217;\u043e\u0432.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 libcds<\/b><\/p>\n<div class=\"spoiler_text\">\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 libcds PTB-\u0441\u0445\u0435\u043c\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 <code>cds::gc::PTB<\/code>, \u0434\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 namespace <code>cds::gc::ptb<\/code>. API \u043a\u043b\u0430\u0441\u0441\u0430 <code>cds::gc::PTB<\/code> \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d <code>cds::gc:::HP<\/code>, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:  <\/p>\n<pre><code class=\"cpp\">PTB( size_t nLiberateThreshold = 1024, size_t nInitialThreadGuardCount = 8 ); <\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>nLiberateThreshold<\/code> \u2014 \u043f\u043e\u0440\u043e\u0433 \u0432\u044b\u0437\u043e\u0432\u0430 <code>Liberate<\/code>. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 retired-\u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u0442 \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>Liberate<\/code><\/li>\n<li><code>nInitialThreadGuardCount<\/code> \u2014 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e quard&#8217;\u043e\u0432 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 (\u0442\u043e\u0447\u043d\u0435\u0435, \u043f\u0440\u0438 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 libcds). \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u0438 guard&#8217;\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435<\/li>\n<\/ul>\n<p>  <\/div>\n<\/div>\n<h1>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h1>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0434\u0430\u043b \u043e\u0431\u0437\u043e\u0440 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043c\u043d\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 safe memory reclamation, \u0441\u0434\u0435\u043b\u0430\u0432 \u043e\u0441\u043e\u0431\u044b\u0439 \u0443\u043f\u043e\u0440 \u043d\u0430 \u0441\u0445\u0435\u043c\u044b \u0442\u0438\u043f\u0430 Hazard Pointer. HP-\u0441\u0445\u0435\u043c\u0430 \u0438 \u0435\u0451 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0432 lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  \u0412\u0441\u0435 \u0432\u044b\u0448\u0435\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043a \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 libcds, \u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c (attach) \u043f\u043e\u0442\u043e\u043a\u0438 \u043a \u0441\u0445\u0435\u043c\u0435 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0441\u0445\u0435\u043c\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 <code>GC<\/code> \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libcds. \u0417\u0430\u0449\u0438\u0442\u0430 \u0441\u0441\u044b\u043b\u043e\u043a, \u0432\u044b\u0437\u043e\u0432 <code>Scan()<\/code> \/ <code>Liberate()<\/code> \u0438 \u043f\u0440. \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u0443\u0436\u0435 \u0437\u0430\u0448\u0438\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<p>  \u0417\u0430 \u0431\u043e\u0440\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u2014 RCU, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0442 HP-like \u0441\u0445\u0435\u043c, \u2014 \u043d\u043e \u043e \u043d\u0435\u043c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0441\u044b\u043b\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\">[Fra03] Keir Fraser <a href=\"http:\/\/www.cl.cam.ac.uk\/techreports\/UCAM-CL-TR-579.pdf\">Practical Lock Freedom<\/a>, 2004; technical report is based on a dissertation submitted September 2003 by K.Fraser for the degree of Doctor of Philosophy to the University of Cambridge, King&#8217;s College<\/p>\n<p>  [GPST05] Anders Gidenstam, Marina Papatriantafilou, Hakan Sundell, Philippas Tsigas <a href=\"http:\/\/www.non-blocking.com\/download\/GidPST05_LockFreeGC_TR.pdf\">Practical and Efficient Lock-Free Garbage Collection Based on Reference Counting<\/a>, Technical Report no. 2005-04 in Computer Science and Engineering at Chalmers University of Technology and Goteborg University, 2005<\/p>\n<p>  [Har01] Timothy Harris <a href=\"http:\/\/research.microsoft.com\/pubs\/67089\/2001-disc.pdf\">A pragmatic implementation of Non-Blocking Linked List<\/a>, 2001<\/p>\n<p>  [HLM02] M. Herlihy, V. Luchangco, and M. Moir <a href=\"http:\/\/cs.brown.edu\/~mph\/HerlihyLM02\/smli_tr-2002-112.pdf\">The repeat offender problem: A mechanism for supporting<br \/>  dynamic-sized lockfree data structures<\/a> Technical Report TR-2002-112, Sun Microsystems<br \/>  Laboratories, 2002.<\/p>\n<p>  [HLM05] M.Herlihy, V.Luchangco, P.Martin, and M.Moir <a href=\"http:\/\/secs.ceas.uc.edu\/~paw\/classes\/ece975\/sp2010\/papers\/herlihy-05.pdf\">Nonblocing Memory Management Support for Dynamic-Sized Data Structure<\/a>, ACM Transactions on Computer Systems, Vol. 23, No. 2, May 2005, Pages 146\u2013196.<\/p>\n<p>  [Mic02] Maged Michael <a href=\"http:\/\/www.research.ibm.com\/people\/m\/michael\/podc-2002.pdf\">Safe Memory Reclamation for Dynamic Lock-Free Objects Using Atomic Reads and Writes<\/a>, 2002<\/p>\n<p>  [Mic03] Maged Michael <a href=\"http:\/\/www.research.ibm.com\/people\/m\/michael\/ieeetpds-2004.pdf\">Hazard Pointers: Safe Memory Reclamation for Lock-Free Objects<\/a>, 2003<\/p>\n<p>  [MS98] Maged Michael, Michael Scott <a href=\"http:\/\/www.cs.rochester.edu\/u\/scott\/papers\/1996_PODC_queues.pdf\">Simple, Fast and Practical Non-Bloking and Blocking Concurrent Queue Algorithms<\/a>, 1998<\/p>\n<p>  [Tor08] Johan Torp <a href=\"http:\/\/www.johantorp.com\/parallelism08_cpp_mm.pdf\">The parallelism shift and C++\u2019s memory model<\/a>, chapter 13, 2008  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<div class=\"spoiler_text\"><a href=\"http:\/\/habrahabr.ru\/company\/ifree\/blog\/195770\/\">\u041d\u0430\u0447\u0430\u043b\u043e<\/a><br \/>  \u041e\u0441\u043d\u043e\u0432\u044b:  <\/p>\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/ifree\/blog\/195948\/\">\u0410\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0438 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/ifree\/blog\/196548\/\">\u041e\u0442\u043a\u0443\u0434\u0430 \u043f\u043e\u0448\u043b\u0438 \u0431\u044b\u0442\u044c \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/ifree\/blog\/197520\/\">\u041c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438<\/a><\/li>\n<\/ul>\n<p>  \u0418\u0437\u0432\u043d\u0435:  <\/p>\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/ifree\/blog\/196834\/\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 libcds<\/a><\/li>\n<\/ul>\n<p>  <\/div>\n<\/div>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/company\/ifree\/blog\/202190\/\"> http:\/\/habrahabr.ru\/company\/ifree\/blog\/202190\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/26b\/c1b\/103\/26bc1b1037a51443f9a7b13abf61d253.png\" align=\"right\"\/><br \/>  \u041a\u0430\u043a \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u0445, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f ABA-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438. \u042f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e \u044d\u0442\u0438 \u0434\u0432\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0445\u043e\u0442\u044c \u043e\u043d\u0438 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b: \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0438\u0437 \u043d\u0438\u0445.<br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0434\u0430\u043c \u043e\u0431\u0437\u043e\u0440 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043c\u043d\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 (safe memory reclamation) \u0434\u043b\u044f lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e \u0438\u043b\u0438 \u0438\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u044f \u0431\u0443\u0434\u0443 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 lock-free \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u041c\u0430\u0439\u043a\u043b\u0430-\u0421\u043a\u043e\u0442\u0442\u0430 [MS98].<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-202190","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/202190","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=202190"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/202190\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=202190"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=202190"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=202190"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}