{"id":206984,"date":"2014-01-14T08:03:03","date_gmt":"2014-01-14T04:03:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=206984"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=206984","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. RCU<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/faf\/9c1\/2ec\/faf9c12ecadd0926ae483bd3acf62670.png\" align=\"right\"\/><br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0443 \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0445\u0430\u0431\u0440\u0430\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0441 \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u043c\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0440\u0435\u043a\u043b\u0430\u043c\u0438\u0440\u0443\u044f (\u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0430\u0432\u044f\u0437\u0447\u0438\u0432\u043e) \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"http:\/\/libcds.sourceforge.net\">libcds<\/a>.<\/p>\n<p>  \u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u043a\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f lock-free \u043a\u043e\u043d\u0442\u0439\u043d\u0435\u0440\u043e\u0432 \u2014 RCU. \u042d\u0442\u0430 \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0435\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 a la Hazard Pointer.<\/p>\n<p>  Read \u2013 Copy Update (RCU) \u2013 \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u00ab\u043f\u043e\u0447\u0442\u0438 read-only\u00bb, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0435\u0434\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f map \u0438 set \u2013 \u0432 \u043d\u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a\u043e\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u043b\u044f \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0433\u043e map&#8217;\u0430 \u0431\u043e\u043b\u0435\u0435 90% \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u2014 \u044d\u0442\u043e \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043a\u043b\u044e\u0447\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0431\u044b\u043b\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0439; \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u2014 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u0439 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. RCU \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f read-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>  \u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u043e\u0441\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 Read \u2013 Copy Update? \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0434\u0435\u044f \u0431\u044b\u043b\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430: \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0434\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f <i>\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c<\/i> \u0435\u0451, \u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0451 <i>\u043a\u043e\u043f\u0438\u044e<\/i> \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043a\u043e\u043f\u0438\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439, \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \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 \u043d\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u043c. <\/p>\n<p>  <a name=\"habracut\"><\/a><br \/>  \u0421\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u043c \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c \u0442\u0435\u0445\u043d\u0438\u043a\u0438 RCU \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Paul McKenney. \u041e\u043d \u0432\u043e\u0437\u0433\u043b\u0430\u0432\u043b\u044f\u0435\u0442 \u0446\u0435\u043b\u0443\u044e \u0448\u043a\u043e\u043b\u0443 \u00ab\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u0439 RCU\u00bb, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0448\u043b\u043e \u043d\u0435\u043c\u0430\u043b\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0443\u0447\u0435\u043d\u044b\u0445 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 lock-free \u0438 \u043d\u0435\u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0445\u0435\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043f\u043e RCU\u00bb \u0432 \u044f\u0434\u0440\u0435 Linux (Linux-kernel RCU maintainer) \u0438 \u0430\u0432\u0442\u043e\u0440\u043e\u043c <a href=\"http:\/\/www2.rdrop.com\/users\/paulmck\/RCU\/\">\u0440\u044f\u0434\u0430 \u0440\u0430\u0431\u043e\u0442<\/a> \u043f\u043e RCU. <\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/638\/781\/a6f\/638781a6f9d3e183a5fc7f9648b98741.png\" align=\"right\"\/><br \/>  RCU \u0431\u044b\u043b\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0430 \u0432 \u044f\u0434\u0440\u043e Linux \u0432 2002 \u0433\u043e\u0434\u0443 \u0438 \u0441 \u0442\u0435\u0445 \u043f\u043e\u0440 \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0432\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u0432 \u043a\u043e\u0434 \u044f\u0434\u0440\u0430, \u0441\u043c. \u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0441\u043f\u0440\u0430\u0432\u0430. \u0414\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043a\u0430\u043a \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u044f\u0434\u0440\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u044f\u0434\u0440\u043e \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0432\u0441\u0435\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438, \u2014 \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438, \u0442\u0430\u043a \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438, \u2014 \u0442\u043e \u0432 \u044f\u0434\u0440\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u043e\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e. \u041d\u043e \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 RCU, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043e\u043d\u043e? \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0442\u0435\u043e\u0440\u0438\u044e RCU \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u0443\u044e \u0432 \u043d\u0435\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u044e.<\/p>\n<h1>\u041e\u0431\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 RCU<\/h1>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0434\u0435\u0438 RCU \u043e\u0447\u0435\u043d\u044c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e. \u041a\u0430\u043a \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0438\u043c\u0435\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043f\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u0435\u0451 \u0447\u0442\u0435\u043d\u0438\u0435\u043c. \u0422\u043e\u0433\u0434\u0430 \u00ab\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u043c\u00bb \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u043b\u044e\u0431\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u0440\u043e\u043c\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a, \u0443\u0434\u0430\u043b\u044f\u044e\u0449\u0438\u0439 \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u00ab\u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u00bb \u043d\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438\u043d\u0430\u0447\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0431\u0443\u043a\u0435\u0442 \u0442\u0440\u0443\u0434\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u2014 \u043e\u0442 ABA-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0434\u043e memory corruption. RCU \u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u0440\u0438\u0447\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u043e\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u043d\u0435\u0435 \u0441\u0445\u0435\u043c\u044b Hazard Pointers.<\/p>\n<p>  \u0427\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0432 \u0442\u0435\u0445\u043d\u0438\u043a\u0435 RCU \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 <i>\u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f<\/i> (read-side critical section). \u041f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0432 \u0442\u0430\u043a\u0443\u044e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>rcu_read_lock()<\/code>, \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u2014 <code>rcu_read_unlock()<\/code>. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0449\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c; \u0432 \u044f\u0434\u0440\u0435 Linux \u043e\u043d\u0438 \u043d\u0435 \u0432\u0435\u0441\u044f\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e (zero-overhead). <br \/>  \u0415\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f, \u0442\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a \u0432 <i>\u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438<\/i> (quiescent state, quiescent-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435). \u041b\u044e\u0431\u043e\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0445\u043e\u0442\u044f \u0431\u044b \u0435\u0434\u0438\u043d\u043e\u0436\u0434\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0432 quiescent-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <i>grace period<\/i>. \u041a\u0430\u0436\u0434\u0430\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u043f\u0435\u0440\u0435\u0434 grace period, \u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f grace period. \u041a\u0430\u0436\u0434\u044b\u0439 grace period \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043a\u043e\u043d\u0435\u0447\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u043b\u044e\u0431\u0430\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u0430 (\u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u043e\u0432, \u0440\u0430\u0432\u043d\u043e \u043a\u0430\u043a \u0438 \u043a\u0440\u0430\u0445\u0430 \u043f\u043e\u0442\u043e\u043a\u0430). <\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/5f4\/942\/8ee\/5f49428ee84d78af466ea34b5193b071.png\" align=\"right\"\/><br \/>  \u041f\u043e\u0442\u043e\u043a-\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c, \u0443\u0434\u0430\u043b\u044f\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0436\u0434\u0435\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430. \u041e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435 grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0438 \u043e\u0434\u0438\u043d \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 (\u0441\u043c. \u0440\u0438\u0441\u0443\u043d\u043e\u043a, \u043d\u0430 \u043d\u0435\u043c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u00abreads\u00bb \u2014 \u044d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0435\u043a\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a-\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<br \/>  \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430: \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f \u2014 \u00abremoval\u00bb \u2014 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u043e grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430 <code>synchronize_rcu()<\/code> \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0435\u0433\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f. \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u0441\u0432\u043e\u044e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u043c (\u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u0442\u0430\u043a\u0438\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u0435\u0440\u044b\u043c). \u041f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e, \u0432\u0441\u0435 \u0442\u0430\u043a\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0430\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0435\u0440\u0435\u0434 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435\u043c grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430. \u041f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f, \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u0441\u044f, \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u2014 \u00abreclamation\u00bb \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 RCU \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430. \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441 \u2014 \u043a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435 grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435? \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 RCU \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0442\u043e\u0447\u0435\u043d \u043d\u0430 \u044f\u0434\u0440\u043e Linux, \u0433\u0434\u0435 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0449\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0432\u0441\u0435\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u0414\u043b\u044f user space-\u043a\u043e\u0434\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e RCU \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b.<\/p>\n<h1>User-space RCU<\/h1>\n<p>  \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u0430\u043b \u0432 2009 \u0433\u043e\u0434\u0443 M.Desnoyers, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0448\u043a\u043e\u043b\u044b P. McKenney, \u0432 <a href=\"http:\/\/publications.polymtl.ca\/206\/1\/2009_MathieuDesnoyers.pdf\">\u0441\u0432\u043e\u0435\u0439 \u0434\u0438\u0441\u0441\u0435\u0440\u0442\u0430\u0446\u0438\u0438<\/a>, \u0433\u043b\u0430\u0432\u0430 6 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0442\u0430\u043a \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f: User-Level Implementations of RCU.<br \/>  M.Desnoyers \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 3 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f user-space RCU (URCU):  <\/p>\n<ul>\n<li>Quiescent-State-Based Reclamation RCU \u2013 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u0430\u044f \u0434\u043b\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0441\u0445\u0435\u043c\u0430, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0430\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043a\u0438, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f <i>\u0432\u043d\u0435<\/i> \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f, <i>\u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438<\/i> \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u043b\u0438 \u00ab\u044f \u043d\u0430\u0445\u043e\u0436\u0443\u0441\u044c \u0432 quiescent-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438\u00bb. \u0422\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"http:\/\/libcds.sourceforge.net\">libcds<\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443.<\/li>\n<li>User-space RCU \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (General-Purpose URCU) \u2013 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043e\u043f\u0438\u0448\u0443 \u0434\u0430\u043b\u0435\u0435.<\/li>\n<li>User-space RCU \u043d\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u0445 (RCU via Signal Handling) \u2013 \u0442\u043e\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u0445 (\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f *nix-\u0441\u0438\u0441\u0442\u0435\u043c, \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0434\u043b\u044f Windows). \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 libcds, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0447\u0443\u0442\u044c \u0445\u0443\u0436\u0435, \u0447\u0435\u043c general-purpose RCU. \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u043e\u0442\u0441\u044b\u043b\u0430\u044e \u043a \u0434\u0438\u0441\u0441\u0435\u0440\u0442\u0430\u0446\u0438\u0438 M.Desnoyers&#8217;\u0430 \u0438 \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u0430\u043c libcds.<\/li>\n<\/ul>\n<h2>General-Purpose URCU<\/h2>\n<p>  M.Desnoyers \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0438 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c URCU, \u0447\u0442\u043e \u043c\u043d\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0437\u0430 \u043d\u0438\u043c, \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u043c \u0432 libcds.<\/p>\n<p>  \u0412 \u0441\u0445\u0435\u043c\u0435 URCU \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u0432\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:  <\/p>\n<pre><code class=\"cpp\">std::atomic&lt;uint32_t&gt;     g_nGlobalCtl(1) ; struct thread_record {    std::atomic&lt;uint32_t&gt;  nThreadCtl;    thread_record *        pNext;     thread_record(): nThreadCtl(0), pNext(nullptr) {} }; <\/code><\/pre>\n<p>  \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>thread_data<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0442\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a RCU-\u043f\u043e\u0442\u043e\u043a\u043e\u0432.<br \/>  \u041c\u043b\u0430\u0434\u0448\u0438\u0435 31 \u0431\u0438\u0442\u0430 <code>nThreadCtl<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 URCU (\u0434\u0430, URCU \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u043a\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f), \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0445\u043e\u0434\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u0447\u0442\u0435\u043d\u0438\u044f. \u0412 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0443\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430.<br \/>  \u0421\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>g_nGlobalCtl<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430, \u043c\u043b\u0430\u0434\u0448\u0438\u0435 \u0431\u0438\u0442\u044b \u0441\u043b\u0443\u0436\u0430\u0442 \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 per-thread \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 <code>nThreadCtl<\/code> \u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.<br \/>  \u0414\u043b\u044f \u0432\u0445\u043e\u0434\u0430\/\u0432\u044b\u0445\u043e\u0434\u0430 \u0432\/\u0438\u0437 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0436\u0430\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>access_lock<\/code> \u0438 <code>access_unlock<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e:  <\/p>\n<pre><code class=\"cpp\">static uint32_t const c_nControlBit = 0x80000000; static uint32_t const c_nNestMask =  c_nControlBit \u2014 1;  void access_lock() {    thread_record * pRec = get_thread_record();    assert( pRec != nullptr );     uint32_t tmp = pRec-&gt;nThreadCtl.load( std::memory_order_relaxed );    if ( (tmp & c_nNestMask) == 0 ) {        pRec-&gt;nThreadCtl.store(g_nGlobalCtl.load( std::memory_order_relaxed ),             std::memory_order_relaxed );        std::thread_fence( std::memory_order_acquire );    }    else        pRec-&gt;nThreadCtl.fetch_add( 1, std::memory_order_relaxed ); }  void access_unlock() {    thread_record * pRec = get_thread_record();    assert( pRec != nullptr );     pRec-&gt;nThreadCtl.fetch_sub( 1, std::memory_order_release ); } <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e URCU \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 (\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0432 \u043c\u043b\u0430\u0434\u0448\u0438\u0445 31 \u0431\u0438\u0442\u0435 \u043d\u0435 \u043d\u043e\u043b\u044c), \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b\u0437\u043e\u0432 \u043d\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>nThreadCtl<\/code> \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>g_nGlobalCtl<\/code>; \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u0445\u043e\u0434 \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u0431\u044b\u043b \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 grace-\u043f\u0435\u0440\u0438\u043e\u0434 (\u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 <code>g_nGlobalCtl<\/code>), \u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 \u043c\u043b\u0430\u0434\u0448\u0438\u0445 \u0431\u0438\u0442\u0430\u0445 <code>g_nGlobalCtl<\/code> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c, \u0441\u0430\u043c\u043e\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0432\u0445\u043e\u0434\u0435 \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f acquire-\u0431\u0430\u0440\u044c\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u043d \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d (\u00ab\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u00bb) \u0432\u0432\u0435\u0440\u0445 \u0437\u0430 \u0431\u0430\u0440\u044c\u0435\u0440 \u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c, \u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u043c, \u2014 \u0435\u0441\u043b\u0438 \u043d\u0430\u0440\u0443\u0448\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c URCU \u0440\u0430\u0441\u0441\u044b\u043f\u043b\u0435\u0442\u0441\u044f. \u041f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0432\u043e <i>\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e<\/i> \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 grace-\u043f\u0435\u0440\u0438\u043e\u0434 (\u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442) \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.<br \/>  \u041f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u0437 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 (<code>access_unlock<\/code>) \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 <code>nThreadCtl<\/code> \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f release-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438; \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, release-\u0431\u0430\u0440\u044c\u0435\u0440 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u0437 \u0441\u0430\u043c\u043e\u0439 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 (\u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043e\u0442 1 \u043a 0 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438), \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e relaxed-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438. Release-\u0431\u0430\u0440\u044c\u0435\u0440 \u043f\u0440\u0438 \u043e\u0431\u043d\u0443\u043b\u0435\u043d\u0438\u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043e\u0442 1 \u043a 0 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u00ab\u043f\u043e\u0442\u043e\u043a \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 RCU\u00bb, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430, \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 URCU, \u2014 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0438\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u00ab0 \u2014 \u043d\u0435 0\u00bb \u0432 \u043a\u043e\u0434\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430, \u0447\u0442\u043e \u0432\u0440\u044f\u0434 \u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>access_unlock<\/code>, \u0434\u0430 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u043a\u0446\u0438\u0439 URCU \u2013 \u0431\u0435\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 release-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430. <\/p>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043a\u043e\u0434 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u0447\u0442\u0435\u043d\u0438\u0435-\u0437\u0430\u043f\u0438\u0441\u044c \u0438 thread-local \u0434\u0430\u043d\u043d\u044b\u0435. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e \u043d\u0435 zero-overhead, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u0438\u043b\u0438 CAS.<\/p>\n<p>  \u041f\u043e\u0442\u043e\u043a-\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e grace-\u043f\u0435\u0440\u0438\u043e\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d. \u0423\u0441\u043b\u043e\u0432\u0438\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u2014 \u043e\u0434\u043d\u043e \u0438\u0437 \u0434\u0432\u0443\u0445:  <\/p>\n<ul>\n<li>\u041c\u043b\u0430\u0434\u0448\u0438\u0435 \u0431\u0438\u0442\u044b (\u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438) <code>nThreadCtl<\/code> \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0440\u0430\u0432\u043d\u044b \u043d\u0443\u043b\u044e, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 URCU<\/li>\n<li>\u0421\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 <code>nThreadCtl<\/code> \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0441\u043e \u0441\u0442\u0430\u0440\u0448\u0438\u043c \u0431\u0438\u0442\u043e\u043c <code>g_nGlobalCtl<\/code>, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0432\u043e\u0448\u0435\u043b \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430<\/li>\n<\/ul>\n<p>  \u042d\u0442\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439:  <\/p>\n<pre><code class=\"cpp\">bool check_grace_period( thread_record * pRec ) {    uint32_t const v = pRec-&gt;nThreadCtl.load( std::memory_order_relaxed );    return (v & general_purpose_rcu::c_nNestMask)       && ((( v ^ g_nGlobalCtl.load( std::memory_order_relaxed )) & ~c_nNestedMask ));       } <\/code><\/pre>\n<p>  \u041f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0434 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>synchronize<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430:  <\/p>\n<pre><code class=\"cpp\">std::mutex  g_Mutex ; void synchronize() {    std::atomic_thread_fence( std::memory_order_acquire );    {       cds::lock::scoped_lock&lt;std::mutex&gt; sl( g_Mutex );       flip_and_wait();       flip_and_wait();    }    std::atomic_thread_fence( std::memory_order_release ); } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c <code>g_Mutex<\/code> \u2014 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 URCU \u043c\u044c\u044e\u0442\u0435\u043a\u0441 (\u0434\u0430-\u0434\u0430! URCU \u0432\u0441\u0435 \u0436\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0430 <i>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438<\/i>, \u0442\u0430\u043a \u0447\u0442\u043e \u0431\u0435\u0437 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0430 \u043d\u0438\u043a\u0443\u0434\u0430). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a-\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0439\u0442\u0438 \u0432 <code>synchronize<\/code>. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e RCU \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u00ab\u043f\u043e\u0447\u0442\u0438 read-only\u00bb \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u0441\u043e\u0431\u043e\u0439 \u0442\u043e\u043b\u043a\u043e\u0442\u043d\u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0435 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f.<br \/>  \u041f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>flip_and_wait<\/code>:  <\/p>\n<pre><code class=\"cpp\">void flip_and_wait() {    g_nGlobalCtl.fetch_xor( c_nControlBit, std::memory_order_seq_cst );    for (thread_record* pRec = g_ThreadList.head(std::memory_order_acquire);          pRec!= nullptr;           pRec = pRec-&gt;m_pNext )     {      while ( check_grace_period( pRec ))       {         sleep( 10 ); \/\/ \u0436\u0434\u0435\u043c 10 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434         CDS_COMPILER_RW_BARRIER ;      }    } } <\/code><\/pre>\n<p>  \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u043e \u043d\u043e\u0432\u043e\u0433\u043e grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0433\u043e <code>fetch_xor<\/code> \u0438 \u0436\u0434\u0435\u0442 (\u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>check_grace_period<\/code>), \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438-\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0430\u0442 \u044d\u0442\u043e\u0442 \u043d\u043e\u0432\u044b\u0439 grace-\u043f\u0435\u0440\u0438\u043e\u0434. \u0412 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u043c sleep \u043d\u0430 10 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434, \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 libcds \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f template-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u0439 back-off-\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e.<\/p>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>flip_and_wait<\/code> \u0434\u0432\u0430\u0436\u0434\u044b? \u0414\u043b\u044f \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 A \u0438 B. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 <code>flip_and_wait<\/code> \u0432 <code>synchronize<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d:  <\/p>\n<ul>\n<li>\u041f\u043e\u0442\u043e\u043a A \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>access_lock<\/code>. \u0412 \u0442\u0435\u043b\u0435 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043d\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439, \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 <code>g_nGlobalCtl<\/code>, \u043d\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>nThreadCtl<\/code> \u043f\u043e\u0442\u043e\u043a\u0430 (\u0432\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430)<\/li>\n<li>\u041f\u043e\u0442\u043e\u043a B \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>synchronize<\/code>. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 <code>flip_and_wait<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0431\u0438\u0442-\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0432 <code>g_nGlobalCtl<\/code>. \u0422\u0435\u043a\u0443\u0449\u0438\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 1<\/li>\n<li>\u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 URCU \u043d\u0438\u043a\u043e\u0433\u043e \u043d\u0435\u0442 (\u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a A \u0435\u0449\u0451 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>nThreadCtl<\/code>), \u043f\u043e\u0442\u043e\u043a B \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 <code>synchronize<\/code><\/li>\n<li>\u041f\u043e\u0442\u043e\u043a A \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>nThreadCtl<\/code>. \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0441\u0442\u0430\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430, \u0440\u0430\u0432\u043d\u043e\u0435 0<\/li>\n<li>\u041f\u043e\u0442\u043e\u043a A \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 <code>access_lock<\/code> \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438<\/li>\n<li>\u041f\u043e\u0442\u043e\u043a B \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>synchronize<\/code> \u0435\u0449\u0451 \u0440\u0430\u0437 (\u0432\u0438\u0434\u0438\u043c\u043e, \u043e\u043f\u044f\u0442\u044c \u0445\u043e\u0447\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c). \u041e\u043f\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0432 <code>g_nGlobalCtl<\/code>, \u0442\u0430\u043a \u0447\u0442\u043e \u0435\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0435\u043f\u0435\u0440\u044c 0.<\/li>\n<\/ul>\n<p>  \u041d\u043e \u043f\u043e\u0442\u043e\u043a A \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c <i>\u0440\u0430\u043d\u0435\u0435<\/i>, \u0447\u0435\u043c B \u0438\u0437\u043c\u0435\u043d\u0438\u043b grace-\u043f\u0435\u0440\u0438\u043e\u0434! \u041d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 URCU, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u0431\u0443\u043a\u0435\u0442\u0443 \u2014 \u043e\u0442 ABA \u0434\u043e memory corruption. \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c: <code>synchronize<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u043c \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442<\/p>\n<p>  \u0412\u044b\u0437\u044b\u0432\u0430\u044f <code>flip_and_wait<\/code> \u0434\u0432\u0430\u0436\u0434\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430\u0436\u0434\u044b \u043e\u0436\u0438\u0434\u0430\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430, \u043c\u044b \u0440\u0435\u0448\u0430\u0435\u043c \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u2014 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u0440\u0443\u0433\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/b><\/p>\n<div class=\"spoiler_text\">\u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438 \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u0438\u0442\u0430-\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u043d\u0435\u043a\u0438\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a. \u041d\u043e \u0442\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c tagged pointer, \u2014 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e! \u0414\u043b\u044f \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c 32-\u0431\u0438\u0442\u043d\u044b\u043c, \u0442\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u043c \u043d\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u043e. \u041d\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u043c\u0435\u0442\u044c 64-\u0431\u0438\u0442\u043d\u044b\u0439 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u043d\u0430 32-\u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445. \u0422\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043b\u0438\u0431\u043e \u043d\u0435\u0442, \u043b\u0438\u0431\u043e \u043e\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d. \u041b\u0438\u0431\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u043a\u0446\u0438\u0439 URCU, \u0447\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e.<br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u043e\u0431\u0449\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0441 \u0431\u0438\u0442\u043e\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 grace-\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0434\u0432\u0443\u0445 <code>flip_and_wait<\/code>  <\/div>\n<\/div>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f URCU \u0432 libcds<\/h2>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/b73\/c45\/db0\/b73c45db0890ef91918d09616eac1cac.png\" align=\"right\"\/><br \/>  \u0412\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c URCU \u0445\u043e\u0440\u043e\u0448 \u0432\u0441\u0435\u043c, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e <i>\u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c<\/i> \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u044f\u0436\u0435\u043b\u044b\u0439 <code>synchronize<\/code>. \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u0430\u043a-\u0442\u043e \u044d\u0442\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c?<br \/>  \u0414\u0430, \u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u0447\u0435\u043c \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u043c, \u043a\u0430\u043a \u0438 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 Hazard Pointer, \u2014 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435. \u0411\u0443\u0434\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0444\u0435\u0440. \u0424\u0443\u043d\u043a\u0446\u0438\u044e <code>synchronize<\/code> \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0444\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Hazard Pointer, \u0432 URCU \u0431\u0443\u0444\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0449\u0438\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (\u0432\u043e\u043e\u0431\u0449\u0435, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 per-thread \u0431\u0443\u0444\u0435\u0440\u044b, \u043d\u0438\u0447\u0442\u043e \u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442). <br \/>  \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f, \u043d\u0430 \u0434\u043e\u043b\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u043f\u0430\u043b\u0430 \u0434\u043e\u043b\u044f \u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u043f\u0440\u0438 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0431\u0443\u0444\u0435\u0440\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0440\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443.<\/p>\n<p>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libcds \u0438\u043c\u0435\u0435\u0442 <i>\u043f\u044f\u0442\u044c<\/i> \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 URCU, \u0432\u0441\u0435 \u043e\u043d\u0438 \u0436\u0438\u0432\u0443\u0442 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d <code>cds::urcu<\/code>:  <\/p>\n<ul>\n<li><code>general_instant<\/code> \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u0442\u043e\u0447\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 URCU: \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>synchronize<\/code>, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c-\u0442\u043e \u00ab\u043f\u043e\u0447\u0442\u0438 read-only\u00bb, \u0434\u0430\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u043e\u0440\u043c\u043e\u0437\u043d\u0430\u044f<\/li>\n<li><code>general_buffered<\/code> \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043e\u0431\u0449\u0438\u043c lock-free \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 lock-free \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c <a href=\"http:\/\/www.1024cores.net\">\u0414\u043c\u0438\u0442\u0440\u0438\u044f \u0412\u044c\u044e\u043a\u043e\u0432\u0430<\/a> \u2014 <code>cds::container::VyukovMPMCCycleQueue<\/code>. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u0430 \u0441 Hazard Pointer<\/li>\n<li><code>general_threaded<\/code> \u2014 \u043f\u043e\u0434\u043e\u0431\u043d\u0430 <code>general_buffered<\/code>, \u043d\u043e \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a. \u0422\u0430\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 <code>general_buffered<\/code> \u0437\u0430 \u0441\u0447\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u0437\u0430\u0442\u043e \u043d\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u0439<\/li>\n<li><code>signal_buffered<\/code> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 <code>general_buffered<\/code>, \u043d\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 signal-handled URCU. \u041d\u0435 \u0434\u043b\u044f Windows-\u0441\u0438\u0441\u0442\u0435\u043c<\/li>\n<li><code>signal_threaded<\/code> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 <code>general_threaded<\/code> \u0434\u043b\u044f signal-handled URCU. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u0434\u043b\u044f Windows<\/li>\n<\/ul>\n<p>  \u0422\u0430\u043a\u043e\u0435 \u043e\u0431\u0438\u043b\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 URCU \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043f\u043e\u0434 URCU. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043f\u043e\u0434 \u0441\u0445\u0435\u043c\u0443 URCU \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f Hazard Pointer. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f URCU. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u043d\u0443 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0430 \u043d\u0435 \u043f\u044f\u0442\u044c.<br \/>  \u0414\u043b\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434 URCU \u0431\u044b\u043b \u0432\u0432\u0435\u0434\u0435\u043d \u043a\u043b\u0430\u0441\u0441-\u043e\u0431\u0435\u0440\u0442\u043a\u0430 <code>cds::urcu::gc<\/code>:  <\/p>\n<pre><code class=\"cpp\">template &lt;typename RCUimpl&gt; class gc; <\/code><\/pre>\n<p>  \u0433\u0434\u0435 <code>RCUimpl<\/code> \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 URCU: <code>general_instant<\/code>, <code>general_buffered<\/code> \u0438 \u0442.\u00a0\u0434. \u0418\u043c\u0435\u044f \u0442\u0430\u043a\u0443\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0443, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f URCU \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u0435\u0433\u043a\u043e \u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439:  <\/p>\n<pre><code class=\"cpp\">template &lt;    class RCU,    typename Key,    typename Value,    class Traits &gt; class SplitListMap&lt; cds::urcu::gc&lt; RCU &gt;, Key, Value, Traits &gt; ... <\/code><\/pre>\n<p>  C\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 libcds \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 URCU \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 <code>synchronize<\/code>, \u0430 <code>retire_ptr<\/code>. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440 URCU \u0438 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0444\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d) \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>synchronize<\/code>. \u0422\u0430\u043a \u0447\u0442\u043e \u044f\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>synchronize<\/code> \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0445\u043e\u0442\u044f \u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 URCU \u0438 Hazard Pointer.<\/p>\n<p>  \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b URCU \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0439 \u0434\u043b\u044f libcds \u043c\u0430\u043d\u0435\u0440\u0435: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442-\u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430-\u043e\u0431\u0435\u0440\u0442\u043a\u0438 <code>cds::urcu::gc&lt;cds::urcu::general_buffered&lt;&gt; &gt; <\/code> \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 <code>main()<\/code>, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>cds::Initialize()<\/code>:  <\/p>\n<pre><code class=\"cpp\">#include &lt;cds\/init.h&gt;  \/\/cds::Initialize \u0438 cds::Terminate #include &lt;cds\/gc\/general_buffered.h&gt; \/\/ general_buffered URCU  int main(int argc, char** argv) {     \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c libcds     cds::Initialize() ;    {        \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c general_buffered URCU \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d        cds::urcu::gc&lt;cds::urcu::general_buffered&lt;&gt; &gt; gbRCU ;         \/\/ \u0415\u0441\u043b\u0438 main thread \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b        \/\/ main thread \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d         \/\/ \u043a \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 libcds        cds::threading::Manager::attachThread() ;        \/\/ \u0412\u0441\u0451, libcds \u0433\u043e\u0442\u043e\u0432\u0430 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e       \/\/ \u0414\u0430\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432\u0430\u0448 \u043a\u043e\u0434       ...    }     \/\/ \u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c libcds    cds::Terminate() ; }  <\/code><\/pre>\n<p>  \u0422\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f \u0441\u0445\u0435\u043c\u044b Hazard Pointer, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 URCU-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u043e\u0441\u043e\u0431\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code class=\"cpp\">\/\/ cds::threading::Manager #include &lt;cds\/threading\/model.h&gt;  int myThreadEntryPoint(void *) {     \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u043a \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 libcds     cds::threading::Manager::attachThread() ;      \/\/ \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c      \/\/ lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b libcds     ...     \/\/ \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u043e\u0442 libcds    cds::threading::Manager::detachThread() ;     return 0; } <\/code><\/pre>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 URCU-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libcds \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\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 \u043e\u0431\u044a\u0435\u043a\u0442-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 URCU gc, \u2014 \u0438 \u0432\u0441\u0451. \u0412\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 URCU \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 URCU-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<br \/>  \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u0440\u0435\u0448\u0438\u0442\u0435\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \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 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 URCU \u0438\u0437 libcds, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c URCU-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0432\u0435\u0440\u0445\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0435\u0442: \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>gc::access_lock()<\/code>, \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u2014 <code>gc::access_unlock()<\/code> (\u0437\u0434\u0435\u0441\u044c <code>gc<\/code> \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 URCU; \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u043a\u0443 scoped lock \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439). \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043d\u043a\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u043c\u0435\u0442\u043e\u0434 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u0447\u0442\u0435\u043d\u0438\u044f, \u043d\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u043c\u043e\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>gc::retire_ptr<\/code>, \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f <i>\u0432\u043d\u0435<\/i> \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438, \u0438\u043d\u0430\u0447\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d deadlock: \u043c\u0435\u0442\u043e\u0434 <code>gc::retire_ptr<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>synchronize<\/code>.<\/p>\n<p>  Libcds \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 URCU-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 set \u0438 map. URCU-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0442\u0438\u043f\u0430 \u00ab\u043e\u0447\u0435\u0440\u0435\u0434\u044c\u00bb \u0438 \u00ab\u0441\u0442\u0435\u043a\u00bb \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e, \u2014 \u044d\u0442\u043e \u043d\u0435 \u00ab\u043f\u043e\u0447\u0442\u0438 read-only\u00bb \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u0442\u0430\u043a \u0447\u0442\u043e URCU \u043d\u0435 \u0434\u043b\u044f \u043d\u0438\u0445.<\/p>\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>  \u0412\u043d\u0443\u0442\u0440\u0438:  <\/p>\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/company\/ifree\/blog\/202190\/\">\u0421\u0445\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u044c\u044e<\/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\/206984\/\"> http:\/\/habrahabr.ru\/company\/ifree\/blog\/206984\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/faf\/9c1\/2ec\/faf9c12ecadd0926ae483bd3acf62670.png\" align=\"right\"\/><br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0443 \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0445\u0430\u0431\u0440\u0430\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0441 \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u043c\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0440\u0435\u043a\u043b\u0430\u043c\u0438\u0440\u0443\u044f (\u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0430\u0432\u044f\u0437\u0447\u0438\u0432\u043e) \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"http:\/\/libcds.sourceforge.net\">libcds<\/a>.<\/p>\n<p>  \u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u043a\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f lock-free \u043a\u043e\u043d\u0442\u0439\u043d\u0435\u0440\u043e\u0432 \u2014 RCU. \u042d\u0442\u0430 \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0435\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 a la Hazard Pointer.<\/p>\n<p>  Read \u2013 Copy Update (RCU) \u2013 \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u00ab\u043f\u043e\u0447\u0442\u0438 read-only\u00bb, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0435\u0434\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f map \u0438 set \u2013 \u0432 \u043d\u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a\u043e\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u043b\u044f \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0433\u043e map&#8217;\u0430 \u0431\u043e\u043b\u0435\u0435 90% \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u2014 \u044d\u0442\u043e \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043a\u043b\u044e\u0447\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0431\u044b\u043b\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0439; \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u2014 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u0439 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. RCU \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f read-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>  \u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u043e\u0441\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 Read \u2013 Copy Update? \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0434\u0435\u044f \u0431\u044b\u043b\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430: \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0434\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f <i>\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c<\/i> \u0435\u0451, \u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0451 <i>\u043a\u043e\u043f\u0438\u044e<\/i> \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043a\u043e\u043f\u0438\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439, \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \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 \u043d\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u043c. <\/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-206984","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/206984","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=206984"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/206984\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=206984"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=206984"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=206984"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}