{"id":286147,"date":"2017-05-11T01:45:09","date_gmt":"2017-05-10T21:45:09","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=286147"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=286147","title":{"rendered":"\u0414\u0435\u043b\u0430\u0435\u043c \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7b3\/9d2\/e68\/7b39d2e68a22afcce66af7b6567f8726.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0412 \u044d\u0442\u0438\u0445 3-\u0435\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445, \u0431\u0430\u0440\u044c\u0435\u0440\u0430\u0445 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043e \u0431\u044b\u0441\u0442\u0440\u043e\u043c \u043e\u0431\u043c\u0435\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043e \u00absequence-points\u00bb \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u00abexecute-around-idiom\u00bb, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u2014 \u0443\u043c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0435\u0433\u043e \u0447\u043b\u0435\u043d\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438. \u0410 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0441\u043e\u043a\u043e-\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 8 \u2014 64 \u044f\u0434\u0440\u0430\u0445.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0422\u0440\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438:  <\/p>\n<ol>\n<li>\u0414\u0435\u043b\u0430\u0435\u043c \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c<\/li>\n<li><a href=\"https:\/\/habrahabr.ru\/post\/328362\/\">\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c std::shared_mutex \u0432 10 \u0440\u0430\u0437<\/a><\/li>\n<li><a href=\"https:\/\/habrahabr.ru\/post\/328374\/\">\u041f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 std::map \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e lock-free map<\/a><\/li>\n<\/ol>\n<p>  \u041c\u043e\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c: <a href=\"https:\/\/www.codeproject.com\/Articles\/1183379\/We-make-any-object-thread-safe\">www.codeproject.com\/Articles\/1183379\/We-make-any-object-thread-safe<\/a><br \/>  \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0442\u0435\u0441\u0442\u044b \u0438\u0437 \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u0441\u0442\u0430\u0442\u0435\u0439: <a href=\"https:\/\/github.com\/AlexeyAB\/object_threadsafe\">github.com\/AlexeyAB\/object_threadsafe<\/a><\/p>\n<p>  \u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 C++ \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 (array, list, map\u2026), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0435\u0441\u0442\u044c \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u0437\u0430\u0431\u0443\u0434\u0435\u0442\u0435 \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u043a\u043e\u0434\u0430 mutex-\u043e\u043c \u0438\u043b\u0438 \u043f\u043e \u043e\u0448\u0438\u0431\u043a\u0435 \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u0435 \u0435\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u043c mutex-\u043e\u043c.<br \/>  \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e. \u0410 \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u0447\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435\u0442 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435, \u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0440\u0435\u0448\u0430\u044f \u0435\u0451 \u0443\u0442\u043e\u043d\u0435\u0442 \u0432 \u043e\u0448\u0438\u0431\u043a\u0430\u0445.<br \/>  \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 \u00ab\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u0435\u0435 \u0431\u0435\u0437\u0443\u043f\u0440\u0435\u0447\u043d\u043e\u0441\u0442\u0438\u00bb (\u00abpracticality beats purity\u00bb), \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435, \u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<br \/>  \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0443\u043c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c, \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u0443\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0435\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c. <br \/>  \u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f: <\/p>\n<pre><code class=\"cpp\">int main() {         contfree_safe_ptr&lt; std::map&lt;std::string, int&gt; &gt; safe_map_string_int;          std::thread t1([&]() { safe_map_string_int-&gt;emplace(&quot;apple&quot;, 1); });      std::thread t2([&]() { safe_map_string_int-&gt;emplace(&quot;potato&quot;, 2); });      t1.join(); t2.join();      std::cout &lt;&lt; &quot;apple = &quot; &lt;&lt; (*safe_map_string_int)[&quot;apple&quot;] &lt;&lt;          &quot;, potato = &quot; &lt;&lt; (*safe_map_string_int)[&quot;potato&quot;] &lt;&lt; std::endl;         return 0; }<\/code><\/pre>\n<p>  \u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043c\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u0446\u0438\u0442\u0430\u0442\u044b \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435. <br \/>  \u041c\u044b \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 C++, \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438.<br \/>  \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u00abcontention-free shared-mutex\u00bb \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 contfree_safe_ptr&lt;&gt;. \u0410 \u0432 \u0442\u0440\u0435\u0442\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f contfree_safe_ptr&lt;&gt; \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<h2><b>\u041d\u0430\u0447\u0430\u043b\u043e<\/b><\/h2>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0443\u043c\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f safe_ptr&lt;T&gt;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0435\u043d \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430 T \u0438 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.<br \/>  \u041f\u0440\u0438\u0447\u0435\u043c, \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0438 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u0433\u0434\u0435 \u0434\u0430\u0436\u0435 \u0434\u043b\u044f lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0431\u044b \u0440\u0438\u0441\u043a \u0432\u0435\u0447\u043d\u044b\u0445 deadlock. \u041d\u043e \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 deadlocks. \u0417\u0430\u0442\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 contention-free shared-mutex, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e std::shared_mutex. \u0418 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f safe_ptr&lt;T&gt;, \u043d\u0430\u0437\u0432\u0430\u043d\u043d\u0443\u044e contfree_safe_ptr&lt;&gt;. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044f \u0441 lock-free \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 CDSlib. \u041c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0431\u043b\u0438\u0437\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a CDSlib (SkipListMap \u0438 BronsonAVLTreeMap) \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 contfree_safe_ptr&lt;std::map&lt;&gt;&gt;.<br \/>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0432\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 T \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c \u043e\u0442 \u0432\u0430\u0441 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0448\u0438\u0442\u0435: contfree_safe_ptr&lt;T&gt; ptr_thread_safe;<br \/>  \u0410 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0431\u043b\u0438\u0437\u043a\u043e\u0439 \u043a \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u0432\u044b \u043c\u0435\u0441\u044f\u0446 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0438 lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e contfree_safe_ptr&lt;&gt;. \u0422\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 std::shared_ptr&lt;&gt; \u043d\u0430\u0448 \u0443\u043c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043a\u043e\u043f\u0438\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0430.<br \/>  \u0412 \u043a\u043e\u043d\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d 1 \u0444\u0430\u0439\u043b safe_ptr.h, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 #include \u201csafe_ptr.h\u201d, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441.<\/p>\n<h2><b>\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/b><\/h2>\n<p>  \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 4-\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445:<br \/>  <b>1. Lock-based.<\/b> \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u0449\u0438\u0449\u0435\u043d \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439: spin-lock, std (mutex, recursive_mutex, timed_mutex, shared_timed_mutex, shared_mutex\u2026): <a href=\"http:\/\/en.cppreference.com\/mwiki\/index.php?title=Special%3ASearch&#038;search=mutex\">en.cppreference.com\/mwiki\/index.php?title=Special%3ASearch&#038;search=mutex<\/a><br \/>  <b>2. Atomic.<\/b> \u041e\u0431\u044a\u0435\u043a\u0442 \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f std::atomic&lt;T&gt;, \u0433\u0434\u0435 T \u2013 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, bool \u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f (std::is_integral&lt;T&gt;::value == true), \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u0442\u0438\u043f\u0430 T \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 CPU: <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/atomic\/atomic\">en.cppreference.com\/w\/cpp\/atomic\/atomic<\/a><br \/>  <b>2+1 (Lock-based-Atomic)<\/b> \u0418\u043d\u0430\u0447\u0435, \u0435\u0441\u043b\u0438 \u0442\u0438\u043f T \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f trivially copyable type, \u0442.\u0435. \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044e std::is_trivially_copyable&lt;T&gt;::value == true, \u0442\u043e\u0433\u0434\u0430 std::atomic&lt;T&gt; \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a Lock-based \u2013 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430<br \/>  <b>3. Transaction-safe.<\/b> \u0424\u0443\u043d\u043a\u0446\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0443\u044e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e transaction_safe (Transactional Memory TS (<a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/n4514.pdf\">ISO\/IEC TS 19841:2015<\/a>) \u2014 Experimental C++): <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/language\/transactional_memory\">en.cppreference.com\/w\/cpp\/language\/transactional_memory<\/a><br \/>  <b>4. Lock-free.<\/b> \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u0442.\u0435. \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0443\u044e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e lock-free <\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0437\u043d\u0430\u0435\u0442\u0435 \u0432\u0441\u0435 4 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0433\u043b\u0430\u0432\u0443.<br \/>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<p>  <b>(4) Lock-free<\/b> \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435, \u0438 \u0447\u0430\u0441\u0442\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442. \u041f\u0440\u0438\u043c\u0435\u0440\u044b lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438: unordered_map, ordered_map, queue\u2026 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043d\u0430\u0443\u0447\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u2013 Concurrent Data Structures (CDS) library: <a href=\"https:\/\/github.com\/khizmax\/libcds\">github.com\/khizmax\/libcds<\/a><br \/>  \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0435 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435\u0442 \u043f\u043b\u0430\u043d\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0445 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 C++17 \u0438\u043b\u0438 C++20 \u0438 \u043e\u043d\u0438 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432: <a href=\"http:\/\/www.open-std.org\/JTC1\/SC22\/WG21\/\">www.open-std.org\/JTC1\/SC22\/WG21<\/a><\/p>\n<p>  <b>(3) Transaction-safe<\/b> \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 C++ \u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 ISO\/IEC TS 19841:2015: <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/n4514.pdf\">www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/n4514.pdf<\/a> <br \/>  \u041d\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0441\u0435 STL-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c transaction-safe. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 std::map \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c, \u0442.\u043a. \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043a\u0430\u043a transaction-safe \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: begin, end, size, max_size, empty. \u041d\u043e \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043a\u0430\u043a \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: find, modify, insert. \u0410 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 transaction-safe \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438-\u0447\u043b\u0435\u043d\u0430\u043c\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043b\u0435\u0433\u043a\u043e, \u0438\u043d\u0430\u0447\u0435 \u044d\u0442\u043e \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u043b\u044f std::map.<\/p>\n<p>  <b>(2) Atomic.<\/b> \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u0436\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u043e\u0432\u0430\u043d \u0432 C++11 \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043b\u0435\u0433\u043a\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e std::atomic shared_val; \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0438\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043d\u0435\u0451 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u0447\u043b\u0435\u043d\u044b \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b std::atomic \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b: [3] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/9d0219a5cfaa3cd5\">coliru.stacked-crooked.com\/a\/9d0219a5cfaa3cd5<\/a><br \/>  Member functions, Specialized member functions: <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/atomic\/atomic\">en.cppreference.com\/w\/cpp\/atomic\/atomic<\/a><br \/>  \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043d\u0435\u0432\u0430\u0436\u043d\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0438\u043b\u0438 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445, \u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Lock-free \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 CAS-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 (Compare-And-Swap) compare_exchange_weak() \u2013 \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e (old_local_val), \u0434\u0435\u043b\u0430\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0443\u0436\u043d\u044b\u0445 \u043d\u0430\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e (new_local_val), \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 CAS-\u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c (old_local_val) \u0438 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0446\u0438\u043a\u043b \u0437\u0430\u043d\u043e\u0432\u043e, \u0430 \u0435\u0441\u043b\u0438 \u0440\u0430\u0432\u043d\u044b \u2013 \u0437\u043d\u0430\u0447\u0438\u0442 \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0442\u043e\u0433\u0434\u0430 \u043c\u0435\u043d\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (new_local_val). \u041f\u0440\u0438\u0447\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 compare_exchange_weak() \u2013 \u044d\u0442\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438 \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f, \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439: [4] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/aa52b45150e5eb0a\">coliru.stacked-crooked.com\/a\/aa52b45150e5eb0a<\/a><br \/>  \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 \u0446\u0438\u043a\u043b\u043e\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u2013 \u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430. \u041f\u0435\u0441\u0441\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f: spin-lock, mutex\u2026<br \/>  \u0410 \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u0435\u0441\u0441\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a, \u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f lock-free. <br \/>  \u0427\u0430\u0441\u0442\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 CAS-\u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u044e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c, \u0432 \u043d\u0435\u0451 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043d\u0435\u0433\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u044f\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0430\u0434 \u044d\u0442\u043e\u0439 \u043a\u043e\u043f\u0438\u0435\u0439, \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 CAS-\u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0435\u0441\u043b\u0438 \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0441\u0442\u0430\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. \u041d\u043e \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430.<br \/>  \u0417\u0434\u0435\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u00abABA\u00bb: <a href=\"https:\/\/en.wikipedia.org\/wiki\/ABA_problem\">en.wikipedia.org\/wiki\/ABA_problem<\/a> \u041a\u043e\u0433\u0434\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0443\u0441\u043f\u0435\u0432\u0430\u044e\u0442 \u0434\u0432\u0430\u0436\u0434\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043f\u0440\u0438\u0447\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u044e\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439. \u0422.\u0435. \u0442\u043e\u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0443\u0436\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u0438 \u0434\u0443\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u043b\u0441\u044f. \u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: LL\/SC, RCU, hazard_pointer, garbage collector\u2026<br \/>  Atomic \u2014 \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0438 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f: std::memory_order_seq_cst. \u041d\u043e \u043a\u0430\u043a \u043c\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0432\u044b\u0448\u0435: \u043d\u0443\u0436\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0443\u0441\u0438\u043b\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.<\/p>\n<p>  <b>(2) \u2013 (1) Atomic &#038; Lock-based.<\/b><br \/>  \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 std::atomic a, b, c; \u0438 \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438 \u0440\u0435\u0448\u0430\u0442\u044c ABA-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u0430\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0430\u044f CAS-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 CPU \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0431\u044b\u043b\u0430 \u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u043e\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 64-bit, \u043d\u043e \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0433\u043b\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f. \u0420\u0435\u0448\u0435\u043d\u0438\u0435: std::atomic&lt;T&gt; \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f T \u2013 \u0442\u0438\u043f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.<br \/>  \u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 C++ \u0432\u0432\u0435\u0434\u0435\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430 T \u0434\u043b\u044f std::atomic&lt;T&gt;, \u0435\u0441\u043b\u0438 \u043e\u043d \u00abtrivially copyable type\u00bb, \u0442.\u0435. \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044e std::is_trivially_copyable&lt;T&gt;::value == true<br \/>  \u0427\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 C++ <b>Working Draft, Standard for Programming Language C++ N4606 2016-07-12<\/b>: <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2016\/n4606.pdf\">www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2016\/n4606.pdf<\/a>  <\/p>\n<blockquote><p><b>\u00a729.5 \/ 1<\/b><br \/>  There is a generic class template<b> atomic&lt;T&gt;<\/b>. The type of the template argument <b>T shall be trivially copyable<\/b> (3.9). [ Note: Type arguments that are not also statically initializable may be difficult to use. \u2014 end note ]  <\/p><\/blockquote>\n<p>  <\/p>\n<blockquote><p><b>\u00a73.9 \/ 9<\/b><br \/>  Scalar types, trivially copyable class types (Clause 9), arrays of such types, and cv-qualified versions of these types (3.9.3) are collectively <b>called trivially copyable types<\/b>  <\/p><\/blockquote>\n<p>  \u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u0430\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0430\u044f CAS-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0431\u044b\u043b\u0430 \u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u043e\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 64-bit, \u0430 \u0443 \u043d\u0430\u0441 3 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e 32-bit, \u0442\u043e \u043a\u0430\u043a \u0436\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 CAS-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432 std::atomic&lt;T&gt;? CAS \u0438 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 (std::mutex \u0438\u043b\u0438 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0434\u0440\u0443\u0433\u0443\u044e), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 std::atomic&lt;T&gt;, \u0434\u043b\u044f T \u2013 trivially copyable types.<br \/>  \u0414\u043b\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u2013 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 struct T { int price, count, total; }; \u043a\u0430\u043a \u0442\u0438\u043f \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 std::atomic&lt;T&gt;. <br \/>  \u041f\u0440\u0438\u043c\u0435\u0440: [5] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/bdfb3dc440eb6e51\">coliru.stacked-crooked.com\/a\/bdfb3dc440eb6e51<\/a>   <\/p>\n<blockquote><p>Example output: 10, 7, 70<\/p><\/blockquote>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 70 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 10*7 \u2013 \u0442.\u0435. \u0432\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e.<br \/>  \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432 gcc \u0438 clang \u0434\u043b\u044f x86 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0444\u043b\u0430\u0433\u043e\u043c -latomic<br \/>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u0430\u0436\u0434\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a std::atomic&lt;T&gt; shared_val; \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0451, \u043e \u0447\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 shared_val.is_lock_free() == false.<br \/>  \u0422.\u0435. \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 (\u0446\u0438\u043a\u043b), \u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 2 \u043f\u0435\u0441\u0441\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439: \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0437\u043e\u0432\u0435 CAS-\u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <b>(1) Lock-based.<\/b><br \/>  \u041d\u043e \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c std::atomic&lt;T&gt; \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 T \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0430\u043c\u0438 \u0438\u0437-\u0437\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u00abtrivially copyable\u00bb \u0434\u043b\u044f \u0442\u0438\u043f\u0430 T. \u0418\u0437 \u0432\u0441\u0435\u0445 STL-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e std::array&lt;&gt;. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c std::atomic&lt;std::map&lt;int, int&gt;&gt;, \u0442.\u043a. \u0442\u0438\u043f std::map&lt;&gt; \u043d\u0435 trivially copyable, \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0435\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430. \u0418 \u0432\u0430\u0448\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0442\u043e\u0436\u0435 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0438\u043f\u0430 T \u0434\u043b\u044f std::atomic&lt;T&gt;.<br \/>  \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u0432, \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 (shared) \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435. Concept: <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/concept\/Mutex\">en.cppreference.com\/w\/cpp\/concept\/Mutex<\/a><br \/>  \u0412 C++ \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b: std::mutex, std::recursive_mutex, std::timed_mutex, std::recursive_timed_mutex, std::shared_timed_mutex, std::shared_mutex. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043d\u0438\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0437\u0434\u0435\u0441\u044c: <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/thread\">en.cppreference.com\/w\/cpp\/thread<\/a><br \/>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043b\u044e\u0431\u043e\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0439 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 std::map&lt;int, T&gt; \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u0437\u0430\u0449\u0438\u0449\u0430\u044e\u0449\u0438\u0439 \u0435\u0433\u043e, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043d\u0438\u0445 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0418 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u043f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430: [6] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/a97e905d54ae1fbb\">coliru.stacked-crooked.com\/a\/a97e905d54ae1fbb<\/a><br \/>  \u041f\u0440\u0438\u0447\u0435\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c RAII-\u0438\u0434\u0438\u043e\u043c\u044b: std::lock_guard&lt;std::mutex&gt; lock(mtx); \u2013 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043c\u044c\u044e\u0442\u0435\u043a\u0441, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0436\u0438\u0437\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043c\u044c\u044e\u0442\u0435\u043a\u0441. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0435\u0433\u043e \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0442.\u043a. \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<br \/>  \u041d\u043e \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0435\u0449\u0451 4 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:  <\/p>\n<ol>\n<li>\u0412\u0437\u0430\u0438\u043c\u043e\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 (deadlocks) \u2013 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u0434 \u0442\u0430\u043a, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a-1 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 mtx1, \u0430 \u043f\u043e\u0442\u043e\u043a-2 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 mtx2, \u0438 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0442\u043e\u043a-1 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c mtx2, \u0430 \u043f\u043e\u0442\u043e\u043a-2 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c mtx1, \u0442\u043e \u044d\u0442\u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0436\u0434\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u0432\u0435\u0447\u043d\u043e. \u042d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043b\u0438\u0448\u0435\u043d\u044b lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043d\u043e \u043d\u0435 \u043b\u044e\u0431\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e lock-free \u2013 \u044d\u0442\u043e \u043c\u044b \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u0434 \u0442\u0430\u043a, \u0447\u0442\u043e \u043f\u043e\u043a\u0430 \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u0432\u044b \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e, \u0436\u0438\u0437\u043d\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0443 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 std::lock_guard, \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043d\u044f\u0442\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u2013 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 Data races, \u0442.\u0435. \u043a \u043d\u0435 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u043a \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438\u043b\u0438 \u043a \u043a\u0440\u0430\u0445\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0422\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0435\u0441\u043b\u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0430.<\/li>\n<li>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0442\u044c \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u0438 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u044c\u044e\u0442\u0435\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u2013 Data races.<\/li>\n<li>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u2013 Data races.<\/li>\n<\/ol>\n<h2><b>Execute Around Pointer Idiom<\/b><\/h2>\n<p>  \u041f\u043e\u043c\u0438\u043c\u043e RAII-\u0438\u0434\u0438\u043e\u043c\u044b \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0438\u0434\u0438\u043e\u043c\u0430 \u2013 Execute Around Pointer, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438:   <\/p>\n<ol>\n<li>\u041c\u044c\u044e\u0442\u0435\u043a\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0438\u0442 \u0441 \u0432\u0430\u0448\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u0438 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u044c\u044e\u0442\u0435\u043a\u0441, \u0430 \u0441\u0430\u043c \u0432\u0430\u0448 \u043e\u0431\u044a\u0435\u043a\u0442<\/li>\n<li>\u041c\u044c\u044e\u0442\u0435\u043a\u0441 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u0447\u043b\u0435\u043d\u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u2013 \u043f\u0440\u0438\u0447\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. <\/li>\n<\/ol>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u044c\u044e\u0442\u0435\u043a\u0441, \u0438 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0442\u044c \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b.<\/p>\n<h2><b>\u0414\u0435\u043b\u0430\u0435\u043c \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c<\/b><\/h2>\n<p>  Execute Around Pointer Idiom \u2013 \u044d\u0442\u043e \u0434\u0430\u0432\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0438\u0434\u0438\u043e\u043c\u0430 \u0441\u043e \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u0430\u044f \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445 \u043e\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: <a href=\"https:\/\/en.wikibooks.org\/wiki\/More_C%2B%2B_Idioms\/Execute-Around_Pointer\">en.wikibooks.org\/wiki\/More_C%2B%2B_Idioms\/Execute-Around_Pointer<\/a><br \/>  \u041f\u0440\u0438\u043c\u0435\u0440: [7] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/4f3255b5473c73cc\">coliru.stacked-crooked.com\/a\/4f3255b5473c73cc<\/a>  <\/p>\n<pre><code class=\"cpp\">  execute_around&lt;std::vector&lt;int&gt;&gt; vecc(10, 10);    int res = my_accumulate(vecc-&gt;begin(), vecc-&gt;end(), 0);<\/code><\/pre>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u0438\u043f\u0430 proxy, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u0432\u043d\u0443\u0442\u0440\u0438 execute_around, \u0437\u0430\u0442\u0435\u043c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 begin() \u0438 end(), \u0437\u0430\u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f my_accumulate(), \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0435\u0451 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u0442\u0438\u043f\u043e\u043c proxy \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u044b, \u0430 \u0438\u0445 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b.<br \/>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435: <b>C++ Patterns Executing Around Sequences. Kevlin Henney<\/b>: <a href=\"http:\/\/hillside.net\/europlop\/HillsideEurope\/Papers\/ExecutingAroundSequences.pdf\">hillside.net\/europlop\/HillsideEurope\/Papers\/ExecutingAroundSequences.pdf<\/a><br \/>  \u0412 C++ \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 Standard \u00a7 1.9 (13): sequenced before \u0438 sequenced after. \u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u043d\u0438\u0436\u0435 \u0446\u0438\u0442\u0430\u0442\u0430\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0432\u044b 2 \u0440\u0430\u0437\u0430 \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u00absequenced before\u00bb.<br \/>  \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 Execute Around Pointer Idiom \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 C++ <b>Working Draft, Standard for Programming Language C++ N4606 2016-07-12<\/b>: <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2016\/n4606.pdf\">www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2016\/n4606.pdf<\/a><br \/>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u043f\u044f\u0442\u044c \u0446\u0438\u0442\u0430\u0442 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u0446\u0438\u0442\u0430\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 Execute Around Pointer Idiom.<\/p>\n<p>  1. \u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432 T \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u0442 raw-pointers: x-&gt;m \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a (x.operator-&gt;())-&gt;m. \u0422.\u0435. \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (x-&gt;m) \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f ((x.operator-&gt;().operator-&gt;())-&gt;m, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c raw-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. \u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0442\u0440\u0435\u043c\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438: [8] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/dda2474024b78a0b\">coliru.stacked-crooked.com\/a\/dda2474024b78a0b<\/a>  <\/p>\n<blockquote><p><b>\u00a7 13.5.6<\/b><br \/>  operator-&gt; shall be a non-static member function taking no parameters. It implements the class member access syntax that uses -&gt;. <br \/>  postfix-expression -&gt; template opt id-expression <br \/>  postfix-expression -&gt; pseudo-destructor-name<br \/>  An expression x-&gt;m is interpreted as (x.operator-&gt;())-&gt;m for a class object x of type T if T::operator-&gt;() exists and if the operator is selected as the best match function by the overload resolution mechanism (13.3).<\/p><\/blockquote>\n<p>  2. \u041a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u00abinline\u00bb, \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043b\u044e\u0431\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u043e\u0442 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2013 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0447\u043d\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f.  <\/p>\n<blockquote><p><b>\u00a7 1.9 \/ 16<\/b><br \/>  When calling a function (whether or not the function is inline), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is <b>sequenced before<\/b> execution of every expression or statement in the body of the called function.<\/p><\/blockquote>\n<p>  3. \u0412\u0441\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d.  <\/p>\n<blockquote><p><b>\u00a7 1.9 \/ 10<\/b>  <\/p>\n<pre><code class=\"cpp\">void f() { if (S(3).v()) \t\/\/ full-expression includes lvalue-to-rvalue and \/\/ int to bool conversions, performed before \/\/ temporary is deleted at end of full-expression { } }<\/code><\/pre>\n<\/blockquote>\n<p>  4. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0432\u0441\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f.  <\/p>\n<blockquote><p><b>\u00a7 1.9 Footnote 8<\/b><br \/>  As specified in 12.2, after a full-expression is evaluated, a sequence of zero or more invocations of destructor functions for temporary objects takes place, usually in reverse order of the construction of each temporary object.<\/p><\/blockquote>\n<p>  5. \u0422\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u2013 2 \u0441\u043b\u0443\u0447\u0430\u044f \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0430 3-\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.  <\/p>\n<blockquote><p><b>\u00a7 12.2 Temporary objects<\/b><br \/>  <b>\u00a7 12.2 \/ 5<\/b><br \/>  <b>There are three contexts in which temporaries are destroyed at a different point than the end of the full expression.<\/b> The first context is when a default constructor is called to initialize an element of an array with no corresponding initializer (8.6). The second context is when a copy constructor is called to copy an element of an array while the entire array is copied (5.1.5, 12.8). In either case, if the constructor has one or more default arguments, the destruction of every temporary created in a default argument is <b>sequenced before<\/b> the construction of the next array element, if any. The third context is when a reference is bound to a temporary.<\/p><\/blockquote>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 execute_around&lt;&gt;  <\/p>\n<pre><code class=\"cpp\">template&lt;typename T, typename mutex_type = std::recursive_mutex&gt; class execute_around {   std::shared_ptr&lt;mutex_type&gt; mtx;   std::shared_ptr&lt;T&gt; p;     void lock() const { mtx-&gt;lock(); }   void unlock() const { mtx-&gt;unlock(); }   public:     class proxy {       std::unique_lock&lt;mutex_type&gt; lock;       T *const p;       public:         proxy (T * const _p, mutex_type& _mtx) : lock(_mtx), p(_p)  { std::cout &lt;&lt; &quot;locked \\n&quot;;}          proxy(proxy &&px) : lock(std::move(px.lock)), p(px.p)  {}         ~proxy () { std::cout &lt;&lt; &quot;unlocked \\n&quot;; }         T* operator -&gt; () {return p;}         const T* operator -&gt; () const {return p;}     };       template&lt;typename ...Args&gt;     execute_around (Args ... args) :          mtx(std::make_shared&lt;mutex_type&gt;()), p(std::make_shared&lt;T&gt;(args...))  {}         proxy operator -&gt; () { return proxy(p.get(), *mtx); }     const proxy operator -&gt; () const { return proxy(p.get(), *mtx); }     template&lt;class Args&gt; friend class std::lock_guard; };<\/code><\/pre>\n<p>  \u0418 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 execute_around&lt;&gt; \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u0438\u043c\u0435\u0440:[45] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/d2e02b61af6459f5\">coliru.stacked-crooked.com\/a\/d2e02b61af6459f5<\/a>  <\/p>\n<pre><code class=\"cpp\">int main() {     typedef execute_around&lt;std::vector&lt;int&gt;&gt; T;     T vecc(10, 10);      int res = my_accumulate(vecc-&gt;begin(), vecc-&gt;end(), 0);     return 0; }<\/code><\/pre>\n<p>  \u0422\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u0438\u0434\u0443.<br \/>  1. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e 1-\u0439 \u0446\u0438\u0442\u0430\u0442\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430, x-&gt;m \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a (x.operator-&gt;())-&gt;m:  <\/p>\n<pre><code class=\"cpp\">  int res = my_accumulate( (vecc.operator-&gt;())-&gt;begin(), (vecc.operator-&gt;())-&gt;end(),  0);<\/code><\/pre>\n<p>  2. \u0422.\u043a. vecc.operator-&gt;() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 T::proxy(), \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:  <\/p>\n<pre><code class=\"cpp\">  int res = my_accumulate(  T::proxy(vecc.p.get(), *vecc.mtx)-&gt;begin(), T::proxy(vecc.p.get(), *vecc.mtx)-&gt;end(), 0);<\/code><\/pre>\n<p>  3. \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0446\u0438\u0442\u0430\u0442\u0430\u043c 2, 3 \u0438 4 \u2013 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u0438\u043f\u0430 proxy \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0447\u043d\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f, \u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f):  <\/p>\n<pre><code class=\"cpp\">T::proxy tmp1(vecc.p.get(), *vecc.mtx);\t\/\/ lock-1 std::recursive_mutex T::proxy tmp2(vecc.p.get(), *vecc.mtx);\t\/\/ lock-2 std::recursive_mutex    int res = my_accumulate(tmp1-&gt;begin(), tmp2-&gt;end(), 0);  tmp2.~ T::proxy();\t\t\t\t\/\/ unlock-2 std::recursive_mutex tmp1.~ T::proxy();\t\t\t\t\/\/ unlock-1 std::recursive_mutex<\/code><\/pre>\n<p>  4. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043d\u043e\u0432\u0430 1-\u0439 \u0446\u0438\u0442\u0430\u0442\u0435: <br \/>  \u2022 tmp1-&gt;begin() \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e (tmp1.operator-&gt;())-&gt;begin()<br \/>  \u2022 tmp1.operator-&gt;() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 p<br \/>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0433\u0434\u0435 p \u2013 \u044d\u0442\u043e shared_ptr-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043d\u0430\u0448 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 std::vector:  <\/p>\n<pre><code class=\"cpp\">typedef execute_around&lt;std::vector&lt;int&gt;&gt; T;     T vecc(10, 10);  T::proxy tmp1(vecc.p.get(), *vecc.mtx);\t\/\/ lock-1 std::recursive_mutex T::proxy tmp2(vecc.p.get(), *vecc.mtx);\t\/\/ lock-2 std::recursive_mutex    int res = my_accumulate(tmp1.p-&gt;begin(), tmp2.p -&gt;end(), 0);  tmp2.~ T::proxy();\t\t\t\t\/\/ unlock-2 std::recursive_mutex tmp1.~ T::proxy();\t\t\t\t\/\/ unlock-1 std::recursive_mutex<\/code><\/pre>\n<p>  \u0417\u0430 4 \u0448\u0430\u0433\u0430 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0442\u0440\u043e\u0433\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438\u0434\u0438\u043e\u043c\u044b. \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 tmp1 \u0438 tmp2, \u0442.\u0435. \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d tmp2, \u0430 \u0437\u0430\u0442\u0435\u043c tmp1, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<br \/>  \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c \u043a 5-\u043e\u0439 \u0446\u0438\u0442\u0430\u0442\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430, \u0442.\u043a. \u0432 \u043d\u0435\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u044b 3 \u0441\u043b\u0443\u0447\u0430\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432\u0440\u0435\u043c\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e, \u0438 \u043a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435\u043c\u0443. \u041f\u0435\u0440\u0432\u044b\u0435 2 \u0441\u043b\u0443\u0447\u0430\u044f \u0432 \u0446\u0438\u0442\u0430\u0442\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u2013 \u044d\u0442\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043b\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d\u0438 \u0443\u043a\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442 \u0436\u0438\u0437\u043d\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 3-\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0434\u043b\u0435\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u0441\u044b\u043b\u043a\u0438.<\/p>\n<h2><b>\u041f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432<\/b><\/h2>\n<p>  \u0421\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u0441\u044c, \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 safe_ptr&lt;&gt; \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f, \u0438 \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0442\u0438\u043f?<br \/>  safe_ptr&lt;std::map&lt;std::string, std::pair&lt;std::string, int&gt; &gt;&gt; safe_map_strings;<br \/>  \u0414\u0430\u043b\u0435\u0435 \u0441 \u044d\u0442\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0430 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432: std::shared_ptr&lt;std::map&lt;std::string, std::pair&lt;std::string, int&gt; &gt;&gt;<br \/>  \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u043e\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c:   <\/p>\n<pre><code class=\"cpp\">    (*safe_map_strings)[&quot;apple&quot;].first = &quot;fruit&quot;;     (*safe_map_strings)[&quot;potato&quot;].first = &quot;vegetable&quot;;      safe_map_strings-&gt;at(&quot;apple&quot;).second = safe_map_strings-&gt;at(&quot;apple&quot;).second * 2;     safe_map_strings-&gt;find(&quot;potato&quot;)-&gt;second.second++;<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e: std::map&lt;&gt;.[9] <br \/>  <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/5def728917274b22\">coliru.stacked-crooked.com\/a\/5def728917274b22<\/a><\/p>\n<pre><code class=\"cpp\">#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;memory&gt; #include &lt;mutex&gt; #include &lt;thread&gt; #include &lt;map&gt;  template&lt;typename T, typename mutex_t = std::recursive_mutex, typename x_lock_t =  std::unique_lock&lt;mutex_t&gt;, typename s_lock_t = std::unique_lock&lt;mutex_t &gt;&gt; class safe_ptr {     typedef mutex_t mtx_t;     const std::shared_ptr&lt;T&gt; ptr;     std::shared_ptr&lt;mutex_t&gt; mtx_ptr;      template&lt;typename req_lock&gt;     class auto_lock_t {         T * const ptr;         req_lock lock;     public:         auto_lock_t(auto_lock_t&& o) : ptr(std::move(o.ptr)), lock(std::move(o.lock)) { }         auto_lock_t(T * const _ptr, mutex_t& _mtx) : ptr(_ptr), lock(_mtx){}         T* operator -&gt; () { return ptr; }         const T* operator -&gt; () const { return ptr; }     };      template&lt;typename req_lock&gt;     class auto_lock_obj_t {         T * const ptr;         req_lock lock;     public:         auto_lock_obj_t(auto_lock_obj_t&& o) :  ptr(std::move(o.ptr)), lock(std::move(o.lock)) { }         auto_lock_obj_t(T * const _ptr, mutex_t& _mtx) : ptr(_ptr), lock(_mtx){}         template&lt;typename arg_t&gt;         auto operator [] (arg_t arg) -&gt; decltype((*ptr)[arg]) { return (*ptr)[arg]; }     };      void lock() { mtx_ptr-&gt;lock(); }     void unlock() { mtx_ptr-&gt;unlock(); }     friend struct link_safe_ptrs;     template&lt;typename mutex_type&gt; friend class std::lock_guard;     \/\/template&lt;class... mutex_types&gt; friend class std::lock_guard;    \/\/ C++17 public:     template&lt;typename... Args&gt;     safe_ptr(Args... args) : ptr(std::make_shared&lt;T&gt;(args...)), mtx_ptr(std::make_shared&lt;mutex_t&gt;()) {}      auto_lock_t&lt;x_lock_t&gt; operator -&gt; () { return auto_lock_t&lt;x_lock_t&gt;(ptr.get(), *mtx_ptr); }     auto_lock_obj_t&lt;x_lock_t&gt; operator * () { return auto_lock_obj_t&lt;x_lock_t&gt;(ptr.get(), *mtx_ptr); }     const auto_lock_t&lt;s_lock_t&gt; operator -&gt; () const { return auto_lock_t&lt;s_lock_t&gt;(ptr.get(), *mtx_ptr); }     const auto_lock_obj_t&lt;s_lock_t&gt; operator * () const { return auto_lock_obj_t&lt;s_lock_t&gt;(ptr.get(), *mtx_ptr); } }; \/\/ ---------------------------------------------------------------   safe_ptr&lt;std::map&lt;std::string, std::pair&lt;std::string, int&gt; &gt;&gt; safe_map_strings_global;   void func(decltype(safe_map_strings_global) safe_map_strings)  {     \/\/std::lock_guard&lt;decltype(safe_map_strings)&gt; lock(safe_map_strings);      (*safe_map_strings)[&quot;apple&quot;].first = &quot;fruit&quot;;     (*safe_map_strings)[&quot;potato&quot;].first = &quot;vegetable&quot;;      for (size_t i = 0; i &lt; 10000; ++i) {         safe_map_strings-&gt;at(&quot;apple&quot;).second++;         safe_map_strings-&gt;find(&quot;potato&quot;)-&gt;second.second++;     }      auto const readonly_safe_map_string = safe_map_strings;      std::cout &lt;&lt; &quot;potato is &quot; &lt;&lt; readonly_safe_map_string-&gt;at(&quot;potato&quot;).first &lt;&lt;         &quot; &quot; &lt;&lt; readonly_safe_map_string-&gt;at(&quot;potato&quot;).second &lt;&lt;         &quot;, apple is &quot; &lt;&lt; readonly_safe_map_string-&gt;at(&quot;apple&quot;).first &lt;&lt;         &quot; &quot; &lt;&lt; readonly_safe_map_string-&gt;at(&quot;apple&quot;).second &lt;&lt; std::endl; }   int main() {      std::vector&lt;std::thread&gt; vec_thread(10);     for (auto &i : vec_thread) i = std::move(std::thread(func, safe_map_strings_global));      for (auto &i : vec_thread) i.join();      std::cout &lt;&lt; &quot;end&quot;;     int b; std::cin &gt;&gt; b;      return 0; }<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u0412\u044b\u0432\u043e\u0434: <br \/>  potato is vegetable 65042, apple is fruit 65043<br \/>  potato is vegetable 81762, apple is fruit 81767<br \/>  potato is vegetable 84716, apple is fruit 84720<br \/>  potato is vegetable 86645, apple is fruit 86650<br \/>  potato is vegetable 90288, apple is fruit 90291<br \/>  potato is vegetable 93070, apple is fruit 93071<br \/>  potato is vegetable 93810, apple is fruit 93811<br \/>  potato is vegetable 95788, apple is fruit 95790<br \/>  potato is vegetable 98951, apple is fruit 98952<br \/>  potato is vegetable 100000, apple is fruit 100000<br \/>  end<\/p><\/blockquote>\n<p>  \u041e\u0442\u0441\u044e\u0434\u0430 2 \u0432\u044b\u0432\u043e\u0434\u0430:  <\/p>\n<ol>\n<li>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u044b\u0435 100000 \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 10 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0448 \u043a\u043e\u0434, \u0447\u0442\u043e\u0431\u044b operator -&gt; \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0438\u043f\u043e\u0432 <b>auto_lock_t<\/b> \u0438 <b>auto_lock_obj_t <\/b>, \u043a\u0430\u043a \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0435\u0441\u043b\u0438 \u0431\u044b \u043a\u043e\u0434 \u041d\u0415 \u0431\u044b\u043b \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c \u2013 data-race: [10] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/45d47bcb066adf2e\">coliru.stacked-crooked.com\/a\/45d47bcb066adf2e<\/a><\/li>\n<li>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043a\u0440\u0430\u0442\u043d\u044b\u0435 10000 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u0442.\u0435. \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0441\u0440\u0435\u0434\u0438 \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a. \u0422.\u0435. \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u043e\u043c operator++ \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043c\u044c\u044e\u0442\u0435\u043a\u0441, \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f, \u0430 \u0434\u0430\u043b\u0435\u0435 \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u043c\u043e\u0433 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <b>std::lock_guard<\/b>&lt;&gt;, \u0438 \u0443\u0432\u0438\u0434\u0438\u043c \u043a\u0430\u043a\u043e\u0439-\u0431\u044b \u0431\u044b\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0435\u0441\u043b\u0438 \u0431\u044b \u043f\u043e\u0442\u043e\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0430 \u043d\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e: [11] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/cc252270fa9f7a78\">coliru.stacked-crooked.com\/a\/cc252270fa9f7a78<\/a><\/li>\n<\/ol>\n<p>  \u041e\u0431\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0442, \u0447\u0442\u043e \u043d\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d \u043a\u043b\u0430\u0441\u0441\u0430 \u0443\u043c\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f safe_ptr&lt;T&gt; \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0438\u043f\u0430 T.<\/p>\n<h2><b>\u041f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c, \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/b><\/h2>\n<p>  \u041f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0430\u0441\u044c \u0438\u0445 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c. \u0418 \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0447\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<br \/>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c 2 \u0442\u0430\u0431\u043b\u0438\u0446\u044b:<br \/>  <img decoding=\"async\" src=\"https:\/\/hsto.org\/web\/6a4\/573\/aa9\/6a4573aa9dd54722965d7de7732bf825.jpg\" alt=\"image\"\/>  <\/p>\n<ol>\n<li><b>user_accounts(INT user_id, STRING user_name, INT money)<\/b> \u2013 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u0435\u043d\u0435\u0433 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u2013 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043f\u043e \u043f\u043e\u043b\u044e user_id<\/li>\n<li><b>cash_flows(INT unique_id, INT src_id, INT dst_id, INT time, INT money)<\/b> \u2013 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u043d\u0435\u0433 \u2013 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435: \u043f\u043e \u043f\u043e\u043b\u044e src_id \u0438 \u043f\u043e \u043f\u043e\u043b\u044e dst_id<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"cpp\">\/\/ 1-st table  struct user_accounts_t {      std::string user_name; int64_t money;      user_accounts_t(std::string u, int64_t m) : user_name(u), money(m) {} };  std::map&lt;uint64_t, user_accounts_t&gt; user_accounts;  \/\/ 2-nd table  struct cash_flows_t { uint64_t unique_id, src_id, dst_id, time; int64_t money; };  std::atomic&lt;uint64_t&gt; global_unique_id;\t\/\/ SQL-sequence std::multimap&lt;uint64_t, std::shared_ptr&lt;cash_flows_t&gt;&gt; cash_flows_src_id; std::multimap&lt;uint64_t, std::shared_ptr&lt;cash_flows_t&gt;&gt; cash_flows_dst_id;<\/code><\/pre>\n<p>  \u0412 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u0421\u0423\u0411\u0414 (RDBMS):   <\/p>\n<ul>\n<li>1-\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u043f\u043e \u043f\u043e\u043b\u044e user_id \u2013 \u044d\u0442\u043e Index-Organized-Table (Oracle) \u0438\u043b\u0438 Table with Clustered Index (MS SQL). <\/li>\n<li>2-\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2013 \u044d\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0434\u0432\u0443\u043c\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044e src_id \u0438 \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044e dst_id \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. <\/li>\n<\/ul>\n<p>  \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0438 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043b\u044f \u0434\u0435\u043d\u0435\u0436\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u043e \u043f\u043e\u043b\u044f\u043c user_id, src_id, dst_id \u0443\u0441\u043a\u043e\u0440\u044f\u044e\u0442 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043d\u0438\u043c \u0432 \u0441\u043e\u0442\u043d\u0438 \u0442\u044b\u0441\u044f\u0447 \u0440\u0430\u0437, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b.<br \/>  \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u043e\u0442 \u0442\u0440\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u0438\u0448\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0442\u0440\u0435\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445:<br \/>  1. <b>move_money() <\/b>\u2013 \u043f\u043e\u0442\u043e\u043a \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0434\u0435\u043d\u044c\u0433\u0438 \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u0440\u0443\u0433\u043e\u043c\u0443  <\/p>\n<ul>\n<li> a) \u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043e\u0442\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0435\u043d\u044c\u0433\u0438<\/li>\n<li> b) \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u0443 \u0436\u0435 \u0441\u0443\u043c\u043c\u0443 \u0434\u0435\u043d\u0435\u0433<\/li>\n<li> c) \u0432 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u043f\u043e\u043b\u044e id-source \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0435\u043d\u0435\u0436\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u043e\u0434\u043a\u0443<\/li>\n<li> d) \u0432 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u043f\u043e\u043b\u044e id-destination \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u0442\u0443 \u0436\u0435 \u0434\u0435\u043d\u0435\u0436\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u043e\u0434\u043a\u0443 (\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c)<\/li>\n<\/ul>\n<p>  2. <b>show_total_amount()<\/b> \u2013 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \u0434\u0435\u043d\u0435\u0433 \u0432\u0441\u0435\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432  <\/p>\n<ul>\n<li>a) \u0412 \u0446\u0438\u043a\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0434\u0435\u043d\u044c\u0433\u0438<\/li>\n<\/ul>\n<p>  3. <b>show_user_money_on_time()<\/b> \u2013 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0435\u043d\u0435\u0433 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 user_id \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 time  <\/p>\n<ul>\n<li>a) incoming \u2013 \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0434\u0435\u043d\u044c\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0448\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 time \u0438 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u043f\u043e\u043b\u044e id-source)<\/li>\n<li>b) outcoming \u2013 \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0434\u0435\u043d\u044c\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0448\u043b\u0438 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 time \u0438 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u043f\u043e\u043b\u044e id-destination)<\/li>\n<li>c) user_money \u2013 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0434\u0435\u043d\u044c\u0433\u0438 \u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/li>\n<li>d) user_ user_money \u2014 incoming + outcoming \u2013 \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0435\u043d\u0435\u0433 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 time<\/li>\n<\/ul>\n<p>  \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0440\u0432\u0430\u043d \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0430\u0442\u044c CPU-Core \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443. \u0421\u0430\u043c\u043e\u0435 \u043e\u043f\u0430\u0441\u043d\u043e\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u0434\u043a\u043e \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0435, \u043d\u043e \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0438 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a data-races, \u0442\u043e \u0432 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u0447\u0435\u0437\u043d\u0443\u0442\u044c \u0434\u0435\u043d\u044c\u0433\u0438.<br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0440\u0435\u0434\u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043b\u043e\u0436\u0430\u0442 \u0441\u043f\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u0447\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438.<br \/>  \u041c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c\u0438 \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b user_accounts, cash_flows_src_id, cash_flows_dst_id \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f safe_ptr&lt;&gt;, \u043d\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u043b\u0438 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u0432\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430?<br \/>  [12] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/5bbba59b63384a2b\">coliru.stacked-crooked.com\/a\/5bbba59b63384a2b<\/a><br \/>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u00ab\u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\u00bb \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 &lt;&lt;&lt;:  <\/p>\n<blockquote><p>Init table safe_user_accounts: <br \/>  at time = 0 &lt;&lt;&lt; <br \/>  1 =&gt; John Smith, 100<br \/>  2 =&gt; John Rambo, 150<br \/>   \u2014 start transaction\u2026 show_total_amount()<br \/>  1 =&gt; John Smith, 100<br \/>  2 =&gt; John Rambo, 100<br \/>  Result: all accounts total_amount = 200 &lt;&lt;&lt; <\/p>\n<p>   \u2014 start transaction\u2026 show_user_money_on_time()<br \/>  1 =&gt; John Smith, 150, at time = 0 &lt;&lt;&lt; <\/p><\/blockquote>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u044b \u0434\u0432\u0435 \u043e\u0448\u0438\u0431\u043a\u0438:  <\/p>\n<ol>\n<li>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432 \u0441\u0443\u043c\u043c\u0435 \u0443 \u0432\u0441\u0435\u0445 (\u0434\u0432\u0443\u0445) \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u044b\u043b\u043e 250 \u0434\u0435\u043d\u0435\u0433, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <b>show_total_amount()<\/b> \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e 200, \u0435\u0449\u0451 50 \u043a\u0443\u0434\u0430-\u0442\u043e \u043f\u0440\u043e\u043f\u0430\u043b\u0438<\/li>\n<li>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 time=0 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 1 \u0431\u044b\u043b\u043e 100 \u0434\u0435\u043d\u0435\u0433, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <b>show_user_money_on_time()<\/b> \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2013 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 1 \u0431\u044b\u043b\u043e 150 \u0434\u0435\u043d\u0435\u0433 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 time=0<\/li>\n<\/ol>\n<p>  \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432, \u043d\u043e \u043d\u0435 \u0432 \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c. \u0420\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u2013 \u044d\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c.<br \/>  \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b \u0436\u0435\u043b\u0442\u044b\u043c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/hsto.org\/web\/9a9\/73a\/e2b\/9a973ae2b9494308874bf812e09133d2.jpg\" alt=\"image\"\/><\/p>\n<p>  \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: [13] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/c8bfc7f5372dfd0c\">coliru.stacked-crooked.com\/a\/c8bfc7f5372dfd0c<\/a><br \/>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u00ab\u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\u00bb \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 &lt;&lt;&lt;:  <\/p>\n<blockquote><p>Init table safe_user_accounts: <br \/>  at time = 0 &lt;&lt;&lt; <br \/>  1 =&gt; John Smith, 100<br \/>  2 =&gt; John Rambo, 150<\/p>\n<p>  Result: all accounts total_amount = 250 &lt;&lt;&lt; <\/p>\n<p>  1 =&gt; John Smith, 100, at time = 0 &lt;&lt;&lt; <\/p><\/blockquote>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u043d\u043e, \u0441\u0443\u043c\u043c\u0430 \u0434\u0435\u043d\u0435\u0433 \u0432\u0441\u0435\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 250, \u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0435\u043d\u0435\u0433 \u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 1 \u0431\u044b\u043b\u0430 100 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 0.<br \/>  \u0422.\u0435. \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u0441 \u043e\u0434\u043d\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u0430 \u0441\u0440\u0430\u0437\u0443 \u0441 3-\u043c\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<br \/>  \u041d\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c deadlock \u2013 \u043a\u043e\u0433\u0434\u0430 2 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u043e\u0432\u0438\u0441\u043d\u0443\u0442 \u0432\u0435\u0447\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u044f \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430. <br \/>  \u0412 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u043c\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u0432 \u043e\u0431\u043e\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 move_money() \u0438 show_user_money_on_time() \u0432 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:  <\/p>\n<ul>\n<li>lock1(safe_user_accounts)<\/li>\n<li>lock2(safe_cash_flows_src_id)<\/li>\n<li>lock3(safe_cash_flows_dst_id)<\/li>\n<\/ul>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<br \/>  \u2022 move_money()  <\/p>\n<ul>\n<li><b>lock2(safe_cash_flows_src_id)<\/b><\/li>\n<li>lock3(safe_cash_flows_dst_id)<\/li>\n<li>lock1(safe_user_accounts)<\/li>\n<\/ul>\n<p>  \u2022 show_user_money_on_time()  <\/p>\n<ul>\n<li>lock3(safe_cash_flows_dst_id)<\/li>\n<li><b>lock2(safe_cash_flows_src_id)<\/b><\/li>\n<li>lock1(safe_user_accounts)<\/li>\n<\/ul>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f move_money() \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0430 lock2 \u0438 \u0436\u0434\u0435\u0442 \u043f\u043e\u043a\u0430 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c\u0441\u044f lock3, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0424\u0443\u043d\u043a\u0446\u0438\u044f show_user_money_on_time() \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0430 lock3 \u0438 \u0436\u0434\u0435\u0442 \u043f\u043e\u043a\u0430 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c\u0441\u044f lock2, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0418 \u0436\u0434\u0430\u0442\u044c \u043e\u043d\u0438 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u0431\u0443\u0434\u0443\u0442 \u0432\u0435\u0447\u043d\u043e.<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440: [14] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/0ddcd1ebe2be410b\">coliru.stacked-crooked.com\/a\/0ddcd1ebe2be410b<\/a><br \/>  \u0412\u044b\u0432\u043e\u0434:  <\/p>\n<blockquote><p>Init table safe_user_accounts: <br \/>  at time = 0 &lt;&lt;&lt; <br \/>  1 =&gt; John Smith, 100<br \/>  2 =&gt; John Rambo, 150<\/p>\n<p>   \u2014 start transaction\u2026 move_money() <br \/>   \u2014 start transaction\u2026 show_total_amount() <\/p>\n<p>  1 =&gt; John Smith, 100<br \/>  2 =&gt; John Rambo, 150<\/p><\/blockquote>\n<p>  \u0422.\u0435. \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>move_money()<\/b> \u0438 <b>show_user_money_on_time()<\/b> \u043d\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b \u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430\u0432\u0435\u0447\u043d\u043e \u0432 deadlock.<br \/>  \u0420\u0435\u0448\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c 4:<br \/>  <b>1.<\/b> \u0412\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u0448\u0438\u0431\u0430\u044e\u0442\u0441\u044f \u2013 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435<br \/>  <b>2.<\/b> \u0412\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441 \u0442\u0438\u043f\u043e\u043c \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b struct all_t { std::map&lt;int,int&gt; m1; std::multimap&lt;int,int&gt; m2; \u2026 }; safe_ptr&lt;all_t&gt; safe_all_obj; \u2013 \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u0438 2 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e safe_ptr&lt;map&lt;int,int&gt;&gt; m1; safe_ptr&lt;multimap&lt;int,int&gt;&gt; m2; \u0438 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0445 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u0443\u044e \u043e\u0434\u043d\u0438\u043c \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u043c, \u0442\u043e \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u0435\u0441\u0442\u0430 \u0433\u0434\u0435 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043c\u0435\u0441\u0442\u043e m2-&gt;at(5); \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e safe_all_obj-&gt;m2.at(5); \u041f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u2013 \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e.<br \/>  <b>3.<\/b> \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c safe_ptr&lt;&gt; \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u044c\u044e\u0442\u0435\u043a\u0441, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u0430\u0436\u043d\u043e \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u043d\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 deadlock. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c 1 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u2013 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e. \u041d\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0442.\u043a. \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0435 \u0432\u0441\u0435\u0445 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043d\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u0412\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u2013 \u0446\u0435\u043d\u043e\u0439 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041f\u0440\u0438\u043c\u0435\u0440: [15] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/2a6f1535e0b95f7b\">coliru.stacked-crooked.com\/a\/2a6f1535e0b95f7b<\/a><br \/>  \u0412\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u2013 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430:<br \/>  <b>static link_safe_ptrs tmp_link(safe_user_accounts, safe_cash_flows_src_id, safe_cash_flows_dst_id);<\/b><br \/>  \u0412\u044b\u0432\u043e\u0434 \u2013 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:  <\/p>\n<blockquote><p>Init table safe_user_accounts: <br \/>  at time = 0 &lt;&lt;&lt; <br \/>  1 =&gt; John Smith, 100<br \/>  2 =&gt; John Rambo, 150<\/p>\n<p>  Result: all accounts total_amount = 250 &lt;&lt;&lt; <\/p>\n<p>  1 =&gt; John Smith, 100, at time = 0 &lt;&lt;&lt; <\/p><\/blockquote>\n<p>  <b>4.<\/b> \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0441\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u0432 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 timeout \u0434\u043b\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0430. \u0410 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u0432 \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u043f\u043e\u0442\u043e\u043a \u0436\u0434\u0435\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u0441\u043d\u043e\u0432\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 <b>lock_timed_any_infinity lock_all(safe_cash_flows_src_id, safe_cash_flows_dst_id, safe_user_accounts);<\/b> \u0438 \u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u041f\u0440\u0438\u043c\u0435\u0440: [16] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/93206f216ba81dd6\">coliru.stacked-crooked.com\/a\/93206f216ba81dd6<\/a><br \/>  \u0422.\u0435. \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044f\u0445:  <\/p>\n<ul>\n<li>\u0422\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 lock_timed_any_infinity \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 deadlock: [17] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/7ac7640918228090\">coliru.stacked-crooked.com\/a\/7ac7640918228090<\/a><\/li>\n<li>\u0410 \u0432 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 lock_guard&lt;&gt; \u2013 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 deadlock: [18] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/a281f90299771434\">coliru.stacked-crooked.com\/a\/a281f90299771434<\/a><\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"https:\/\/hsto.org\/web\/d68\/c3c\/b91\/d68c3cb91ec34066943d3f7aa4fbe0a7.jpg\" alt=\"image\"\/><br \/>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a (locks) \u0440\u0435\u0448\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c\u043e\u0441\u0442\u0438 (<b>Composable<\/b>) \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0431\u0435\u0437 \u0432\u0435\u0447\u043d\u044b\u0445 deadlock: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lock_(computer_science)#Lack_of_composability\">https:\/\/en.wikipedia.org\/wiki\/Lock_(computer_science)#Lack_of_composability<\/a><\/p>\n<h2><b>\u041a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c\u043e\u0441\u0442\u044c (Composable) \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 (Deadlocks)<\/b><\/h2>\n<p>  \u0422.\u043a. \u0432\u044b\u0448\u0435 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u0442\u043e \u043d\u0430\u0448\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u2014 lock-based.<br \/>  \u0410 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0441 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435\u043c deadlocks \u0443 lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Transactional Memory, \u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u043b\u0438 deadlocks \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0421\u0423\u0411\u0414: MSSQL (lock-based IL) \u0438 Oracle (multi-version concurrency control).<br \/>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b lock-free \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. RDBMS (\u0420\u0421\u0423\u0411\u0414) \u0438\u043c\u0435\u044e\u0442 \u0432\u0441\u0435 \u0442\u0435 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 deadlock, \u043a\u0430\u043a \u0432 lock-based \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445, \u0438 \u0447\u0430\u0441\u0442\u043e \u0440\u0435\u0448\u0430\u044e\u0442 \u0438\u0445 \u0442\u0430\u043a \u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0438\u043b\u0438 \u0433\u0440\u0430\u0444\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a. \u0410 \u043d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b transaction-safe \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 C++ \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0442\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a std::map&lt;&gt;.<br \/>  Lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c Composable operations \u2013 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432. \u0422.\u0435. \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0438\u043b\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u044b \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438\u0437 <a href=\"https:\/\/github.com\/khizmax\/libcds\">libCDS<\/a>, \u0438 \u043e\u043d\u0438 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0440\u0430\u0437\u0443 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c, \u0442\u043e \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0442.\u043a. \u0438\u0445 API \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 lock-free \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438. \u041f\u043e\u043a\u0430 \u0432\u044b \u043c\u0435\u043d\u044f\u0435\u0442\u0435 \u0438\u043b\u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u2013 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0443\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u0445, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438\u043c \u0441\u0442\u0430\u043d\u0443\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u044b \u0432\u0441\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b lock-based \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a (deadlocks). \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430:   <\/p>\n<ul>\n<li><a href=\"http:\/\/libcds.sourceforge.net\/doc\/cds-api\/namespacecds_1_1sync.html\">libcds.sourceforge.net\/doc\/cds-api\/namespacecds_1_1sync.html<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/khizmax\/libcds\/tree\/master\/cds\/lock\">github.com\/khizmax\/libcds\/tree\/master\/cds\/lock<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/khizmax\/libcds\/tree\/master\/cds\/sync\">github.com\/khizmax\/libcds\/tree\/master\/cds\/sync<\/a><\/li>\n<\/ul>\n<p>  \u0412 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0445 RDBMS \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a MSSQL (lock-based) \u0438 Oracle (multi-version concurrency control) \u0442\u0430\u043a \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b deadlocks, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u0448\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439, \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 <b>select col from tbl where id in (&#8230;.) for update wait 30;<\/b> \u0415\u0441\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0441\u0442\u0435\u043a\u043b\u043e \u0438\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d deadlock \u0432 \u0433\u0440\u0430\u0444\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a, \u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 rollback (\u043e\u0442\u043a\u0430\u0442) \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u2013 \u0442.\u0435. \u043e\u0442\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u044b \u044d\u0442\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439, \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0433\u043e \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430 (\u0438 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437):  <\/p>\n<ul>\n<li>Oracle Database Online Documentation 11g Release 1 (11.1) \u2014 Deadlocks: <a href=\"https:\/\/docs.oracle.com\/cd\/B28359_01\/server.111\/b28318\/consist.htm#i5337\">docs.oracle.com\/cd\/B28359_01\/server.111\/b28318\/consist.htm#i5337<\/a><br \/>   \u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 Oracle: <a href=\"https:\/\/docs.oracle.com\/cd\/B28359_01\/server.111\/b28318\/consist.htm#i5249\">docs.oracle.com\/cd\/B28359_01\/server.111\/b28318\/consist.htm#i5249<\/a><br \/>   \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u044b\u0435 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043b\u044e\u0431\u044b\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438: Insert\/Update\/Delete\/Select-For-Update<\/li>\n<li>MSSQL Detecting and Ending Deadlocks: <a href=\"https:\/\/technet.microsoft.com\/en-us\/library\/ms178104(v=sql.105).aspx\">https:\/\/technet.microsoft.com\/en-us\/library\/ms178104(v=sql.105).aspx<\/a><br \/>   \u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 MS SQL: <a href=\"https:\/\/technet.microsoft.com\/en-us\/library\/ms186396(v=sql.105).aspx\">https:\/\/technet.microsoft.com\/en-us\/library\/ms186396(v=sql.105).aspx<\/a> <\/li>\n<\/ul>\n<p>  \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c Transactional Memory \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Lock-free \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\/\u0434\u0430\u043d\u043d\u044b\u0445. \u0422.\u0435. Transactional Memory \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c Composable operations. \u0412\u043d\u0443\u0442\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438\u043b\u0438 \u043f\u0435\u0441\u0441\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 (\u0441 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e deadlock conflict) \u0438\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 (\u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e conflicting modifications \u043f\u0440\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0445 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445). \u0410 \u043f\u0440\u0438 \u043b\u044e\u0431\u044b\u0445 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e \u0432\u043b\u0435\u0447\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u2013 \u0430 \u044d\u0442\u043e \u043d\u0435\u0441\u0451\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b. \u042d\u0442\u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0437\u0430 \u0441\u0447\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Hardware Transactional Memory \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 CPU, \u043d\u043e \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0445\u043e\u0442\u044f Intel \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430 Hardware Transactional Memory \u0432 CPU Haswell. \u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 C++ \u0442\u0430\u043a \u0436\u0435 \u043e\u0431\u0435\u0449\u0430\u044e\u0442 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c Transactional Memory, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438 \u0431\u0435\u0437 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 std::map. \u0422.\u0435. \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0432\u0441\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0435\u043e\u0440\u0438\u0438. \u041d\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u043d\u0430\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<br \/>  <b>\u0418\u0442\u043e\u0433\u043e:<\/b>  <\/p>\n<ul>\n<li><b>Lock-based<\/b> \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u044e\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u0430 \u043f\u0440\u0438 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u0442\u0430\u043a\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u0438 \u043c\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445.<\/li>\n<li><b>Lock-free<\/b> \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u044e\u0442\u0441\u044f \u0438 \u0441\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0431\u0435\u0437 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u044d\u0442\u043e \u0441\u0432\u0435\u0440\u0445 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0430 \u0441 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438 \u0442\u0430\u043a\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0443\u0436\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f lock-free \u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0438\u0441\u043a \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0435\u0447\u043d\u044b\u0445 deadlocks.<\/li>\n<li><b>RDBMS<\/b>: MSSQL(lock-based IL) \u0438 Oracle (MVCC) \u2013 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0432\u0435\u0447\u043d\u044b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 (deadlocks), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u0444\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b<\/li>\n<li><b>\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c<\/b> \u0438\u0437 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 C++ \u2013 \u043f\u043e\u043a\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u0438 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0442\u0430\u043a\u0438\u0435, \u043a\u0430\u043a \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 std::map&lt;&gt; \u0438\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/li>\n<\/ul>\n<p>  <b>\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0432\u044b\u0432\u043e\u0434: <\/b> \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 deadlock \u0435\u0441\u0442\u044c \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u0430\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0433\u0434\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043c\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b\u0438 2 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0435\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f safe_ptr&lt;&gt;  <\/p>\n<ol>\n<li><b>static link_safe_ptrs<\/b> tmp_link(safe_user_accounts, safe_cash_flows_src_id, safe_cash_flows_dst_id); \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432<\/li>\n<li><b>lock_timed_any_infinity<\/b> lock_all(safe_cash_flows_src_id, safe_cash_flows_dst_id, safe_user_accounts);- \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a, \u0430 \u043f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u0438 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e<\/li>\n<\/ol>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f safe_ptr&lt;&gt; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e 1 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u044c\u044e\u0442\u0435\u043a\u0441, \u0442\u043e deadlock \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u0432 safe_ptr&lt;&gt;, \u0442.\u043a. \u0434\u043b\u044f deadlock \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c 2 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0430 (\u043b\u0438\u0431\u043e 1 \u043d\u0435\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439).<\/p>\n<h2><b>\u041a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c\u043e\u0441\u0442\u044c (Composable) lock-based \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432<\/b><\/h2>\n<p>  \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e lock-based \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c\u044b (Composable), \u0442.\u0435. \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c 2 lock-based \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. <br \/>  \u041d\u043e \u0432\u044b\u0448\u0435 \u043c\u044b \u043b\u0435\u0433\u043a\u043e \u0441\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u043b\u0438 \u0442\u0440\u0438 lock-based \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043a\u0430\u043a \u0436\u0435 \u043d\u0430\u043c \u044d\u0442\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c? \u0415\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0435\u0442 \u2013 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0436\u0438\u0440\u043d\u044b\u043c \u0448\u0440\u0438\u0444\u0442\u043e\u043c:  <\/p>\n<blockquote><p>Perhaps the most fundamental objection [&#8230;] is that lock-based programs do not compose: correct fragments may fail when combined. For example, consider a hash table with thread-safe insert and delete operations. Now suppose that we want to delete one item A from table t1, and insert it into table t2; but the intermediate state (in which neither table contains the item) must not be visible to other threads. <b>Unless the implementor of the hash table anticipates this need, there is simply no way to satisfy this requirement.<\/b> [&#8230;] In short, operations that are individually correct (insert, delete) cannot be composed into larger correct operations.<\/p><\/blockquote>\n<p>  \u2014Tim Harris et al., \u00abComposable Memory Transactions\u00bb, Section 2: Background, pg.2[6]<br \/>  <a href=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2005\/01\/2005-ppopp-composable.pdf\">www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2005\/01\/2005-ppopp-composable.pdf<\/a><br \/>  \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e lock-based \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u044e\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u0430 \u043f\u0440\u0438 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0422.\u0435. lock-based \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043d\u043e \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0430 lock_timed_any_infinity, \u0435\u0441\u043b\u0438 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0438\u0445 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0443 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438.<br \/>  \u041c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 lock-based \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 safe_ptr&lt;T&gt; \u0438 \u0432 \u043d\u0435\u043c \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430 T \u043c\u044b \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c (solve) deadlocks \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438:<b> link_safe_ptrs<\/b>, <b>lock_timed_any_infinity<\/b>, <b>lock_timed_any_once<\/b>. <\/p>\n<p>  \u0418\u0442\u0430\u043a, \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u0438\u0445 \u043f\u0435\u0441\u0441\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442?  <\/p>\n<ul>\n<li>\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0438 \u044f\u0437\u044b\u043a\u0430 C++<\/li>\n<li>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u0438 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>\u0412 \u043f\u0435\u0441\u0441\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d deadlock \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u043e\u043d \u0442\u0440\u0443\u0434\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0440\u0435\u0434\u043a\u043e. \u0412 \u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d conflicting modifications, \u043e\u043d \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e C++-\u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0447\u0430\u0449\u0435. <\/li>\n<li><b>Tom Kyte<\/b> is a Senior Technical Architect in Oracle\u2019s Server Technology Division \u2013 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043a\u043e\u043c \u043f\u0435\u0441\u0441\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0432 Oracle DB (Multi-Version Concurrency Control): <a href=\"https:\/\/asktom.oracle.com\/pls\/asktom\/f?p=100:11:0::::P11_QUESTION_ID:5771117722373\">https:\/\/asktom.oracle.com\/pls\/asktom\/f?p=100:11:0::::P11_QUESTION_ID:5771117722373<\/a><br \/>   \u0410 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0441\u0441\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 Lockout \u0438 Deadlock \u043e\u043d \u043f\u0438\u0448\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<br \/> <br \/>\n<blockquote><p><b>I am a huge fan of so called pessimistic locking<\/b>. The user has very clearly announced their intent to UPDATE THE DATA. The lockouts they refer to are easily handled with session timeouts (trivial) and the deadlock is so rare and would definitely be an application bug (in both Oracle and RDB).<\/p><\/blockquote>\n<\/li>\n<li>Deadlock \u2013 \u044d\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0445 \u043f\u043e\u043b\u043d\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u043a\u0430 \u0432\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0441\u0432\u043e\u044e \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <b>lock_timed_any_infinity<\/b>. \u0418\u043d\u0430\u0447\u0435, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u0435\u0447\u043d\u0443\u044e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0432\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435: <b>link_safe_ptrs<\/b> \u0438 <b>std::lock_guard<\/b>&lt;&gt;.<\/li>\n<li>\u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u044d\u0441\u043a\u0430\u043b\u0430\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Oracle DB \u044d\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442: <a href=\"https:\/\/docs.oracle.com\/cd\/B28359_01\/server.111\/b28318\/consist.htm#CIHCFHGE\">docs.oracle.com\/cd\/B28359_01\/server.111\/b28318\/consist.htm#CIHCFHGE<\/a><br \/> <br \/>\n<blockquote><p>Oracle Database never escalates locks. Lock escalation greatly increases the likelihood of deadlocks.<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p>  \u041c\u044b \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0431\u043e\u0433\u0430\u0442\u043e\u043c\u0443 \u043e\u043f\u044b\u0442\u0443 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0445 \u0421\u0423\u0411\u0414 \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f safe_ptr&lt;T&gt;<br \/>   \u0438\u0437 safe_ptr.h: <a href=\"https:\/\/github.com\/AlexeyAB\/object_threadsafe\/tree\/master\/any_object_threadsafe\">github.com\/AlexeyAB\/object_threadsafe\/tree\/master\/any_object_threadsafe<\/a><\/p>\n<h3><b>\u0412\u044b\u0432\u043e\u0434:<\/b><\/h3>\n<p> \u041c\u044b \u0434\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c Execute Around Pointer Idiom \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u041f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c\u043e\u0441\u0442\u0438 (composable). \u0410 \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u043b\u044e\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0441\u0441\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/328348\/\"> https:\/\/habrahabr.ru\/post\/328348\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7b3\/9d2\/e68\/7b39d2e68a22afcce66af7b6567f8726.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0412 \u044d\u0442\u0438\u0445 3-\u0435\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445, \u0431\u0430\u0440\u044c\u0435\u0440\u0430\u0445 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043e \u0431\u044b\u0441\u0442\u0440\u043e\u043c \u043e\u0431\u043c\u0435\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043e \u00absequence-points\u00bb \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u00abexecute-around-idiom\u00bb, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u2014 \u0443\u043c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0435\u0433\u043e \u0447\u043b\u0435\u043d\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438. \u0410 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0441\u043e\u043a\u043e-\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 8 \u2014 64 \u044f\u0434\u0440\u0430\u0445.  <\/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-286147","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286147","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=286147"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286147\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=286147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=286147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=286147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}