{"id":286146,"date":"2017-05-11T01:45:05","date_gmt":"2017-05-10T21:45:05","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=286146"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2017-05-10T21:45:05","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=286146","title":{"rendered":"\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c std::shared_mutex \u0432 10 \u0440\u0430\u0437"},"content":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438 C++11 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0438\u043c\u0438 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445 x86_64.<br \/>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u043a \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 <b>contfree_safe_ptr&lt;std::map&gt;<\/b> \u0434\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 <b>lock-free<\/b> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 std::map&lt;&gt;, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: SkipListMap \u0438 BronsonAVLTreeMap \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libCDS (Concurrent Data Structures library): <a href=\"https:\/\/github.com\/khizmax\/libcds\">github.com\/khizmax\/libcds<\/a><br \/>  \u0418 \u0442\u0430\u043a\u0443\u044e \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 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0432\u0430\u0448\u0435\u0433\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0442\u043e\u043a\u043e-<b>\u043d\u0435<\/b>\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 T \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043a\u0430\u043a contfree_safe_ptr&lt;T&gt;. \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 ~1000%, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0443\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u043b\u0430\u0431\u044b\u043c \u0438 \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c.<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><a href=\"https:\/\/habrahabr.ru\/post\/328348\/\">\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<\/a><\/li>\n<li>\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c std::shared_mutex \u0432 10 \u0440\u0430\u0437<\/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\/1183423\/We-make-a-std-shared-mutex-times-faster\">www.codeproject.com\/Articles\/1183423\/We-make-a-std-shared-mutex-times-faster<\/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<h2><b>\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c lock-based \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/h2>\n<p>  contfree_safe_ptr&lt;T&gt; \u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 safe_ptr&lt;T, contention_free_shared_mutex&gt;, \u0433\u0434\u0435 contention_free_shared_mutex \u2013 \u044d\u0442\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 shared-mutex. \u0410 safe_ptr \u2014 \u044d\u0442\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<br \/>  \u041f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \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 <b>contention-free shared-mutex<\/b>, \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0438\u0439 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u044f\u0445. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 spinlock \u0438 recursive-spinlock \u0434\u043b\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a(rows) \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 update. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c RAII-\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. <br \/>  \u0418 \u043a\u0430\u043a \u0431\u043e\u043d\u0443\u0441 \u00abJust for fun\u00bb \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 partitioned_map, \u0435\u0449\u0451 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 std::map, \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 partition table \u0438\u0437 \u0421\u0423\u0411\u0414, \u043a\u043e\u0433\u0434\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e.<\/p>\n<h2><b>\u041e\u0441\u043d\u043e\u0432\u044b \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439<\/b><\/h2>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u044b \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438, \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<br \/>  \u0415\u0441\u043b\u0438 \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0442.\u0435. \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e thread_func() \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445:  <\/p>\n<pre><code class=\"cpp\">int a; void thread_func() { a = a + 1; } \t\/\/ wrong: data-race<\/code><\/pre>\n<p>  \u0422\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u044e thread_func() \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442 1 \u043a \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 int a; \u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c, \u0442.\u043a. \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (RMW \u2013 read-modify-write) \u043d\u0430\u0434 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u0442\u043e\u0440\u044b\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 \u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f a = a+1; \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0438\u0437 \u0442\u0440\u0435\u0445 \u043c\u0438\u043d\u0438-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439:   <\/p>\n<ol>\n<li>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u00aba\u00bb \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/li>\n<li>\u041f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c 1 \u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435<\/li>\n<li>\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u00aba\u00bb<\/li>\n<\/ol>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 int a=0; \u0438 2 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e a=a+1; \u0442\u043e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c a=2; \u041d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u2013 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e:  <\/p>\n<pre><code class=\"cpp\">int a = 0;\t\t\t\/\/ register1 = ?, register2 = ?, a = 0 Thread 1: register1 = a;\t\/\/ register1 = 0, register2 = ?, a = 0 Thread 2: register2 = a; \t\/\/ register1 = 0, register2 = 0, a = 0 Thread 1: register1++;\t\t\/\/ register1 = 1, register2 = 0, a = 0 Thread 2: register2++;\t\t\/\/ register1 = 1, register2 = 1, a = 0 Thread 1: a = register1; \t\/\/ register1 = 1, register2 = 1, a = 1 Thread 2: a = register2; \t\/\/ register1 = 1, register2 = 1, a = 1<\/code><\/pre>\n<p>  \u0414\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u043b\u0438 \u043a \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 +1, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f a = 1 \u2013 \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Data-Races.<br \/>  \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0435\u0441\u0442\u044c 3 \u0441\u043f\u043e\u0441\u043e\u0431\u0430:  <\/p>\n<ol>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u2013 \u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u0438\u043d\u0443\u0441, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u2013 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0438\u0445 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e: <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/atomic\/atomic\">en.cppreference.com\/w\/cpp\/atomic\/atomic<\/a><\/li>\n<li>\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 (std::mutex, std::shared_timed_mutex, spinlock\u2026) \u2013 \u043e\u043d\u0438 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u043a \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043f\u043e 1 \u043f\u043e\u0442\u043e\u043a\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b data-races \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c \u0443\u0433\u043e\u0434\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043b\u044e\u0431\u044b\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e-\u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/li>\n<\/ol>\n<p>  \u0414\u043b\u044f std::atomic&lt;int&gt; a; \u0435\u0441\u043b\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e a=0; \u0438 2 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e a+=1; \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 a=2;<\/p>\n<pre><code class=\"cpp\">std::atomic&lt;int&gt; a; void thread_func() { a += 1; } \t\/\/ correct: no data-race<\/code><\/pre>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445 x86_64 (\u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e):<\/p>\n<pre><code class=\"cpp\">std::atomic&lt;int&gt; a = 0;         \t\/\/ register1 = ?, register2 = ?, a = 0  Thread 1: register1 = a; \t\t\/\/ register1 = 0, register2 = ?, a = 0 Thread 1: register1++;  \t\t\/\/ register1 = 1, register2 = ?, a = 0 Thread 1: a = register1; \t\t\/\/ register1 = 1, register2 = ?, a = 1  Thread 2: register2 = a; \t\t\/\/ register1 = 1, register2 = 1, a = 1 Thread 2: register2++;  \t\t\/\/ register1 = 1, register2 = 2, a = 1 Thread 2: a = register2; \t\t\/\/ register1 = 1, register2 = 2, a = 2<\/code><\/pre>\n<p>  \u041d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 LL\/SC, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 ARM \u0438\u043b\u0438 PowerPC, \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0448\u0430\u0433\u0438, \u043d\u043e \u0441 \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c a = 2.<\/p>\n<p>  \u0410\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 C++11: <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/atomic\/atomic\">en.cppreference.com\/w\/cpp\/atomic\/atomic<\/a><br \/>  \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u043b\u0435\u043d\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 std::atomic&lt;&gt; \u0432\u0441\u0435\u0433\u0434\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u043c\u0438.<br \/>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c 3 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443:<br \/>  1. \u041f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"cpp\">std::atomic&lt;int&gt; a; a = 20; a += 50;<\/code><\/pre>\n<p>  2. \u042d\u0442\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0443 1:  <\/p>\n<pre><code class=\"cpp\">std::atomic&lt;int&gt; a; a.store( 20 ); a.fetch_add( 50 );<\/code><\/pre>\n<p>  3. \u0418 \u044d\u0442\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0443 1:  <\/p>\n<pre><code class=\"cpp\">std::atomic&lt;int&gt; a; a.store( 20, std::memory_order_seq_cst ); a.fetch_add( 50, std::memory_order_seq_cst );<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u043b\u044f std::atomic:  <\/p>\n<ul>\n<li><b>load()<\/b> \u0438 <b>store() <\/b>\u2013 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0447\u0442\u043e <b>operator T<\/b> \u0438 <b>operator=<\/b> \u0438 <\/li>\n<li><b>fetch_add()<\/b> \u0438 <b>fetch_sub()<\/b> \u2013 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0447\u0442\u043e <b>operator+=<\/b> \u0438 <b>operator-=<\/b><\/li>\n<li>Sequential Consistency (std::memory_order_seq_cst) \u2013 \u044d\u0442\u043e \u0431\u0430\u0440\u044c\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439, \u043d\u043e \u0438 \u0441\u0430\u043c\u044b\u0439 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433\u0438\u0445).<\/li>\n<\/ul>\n<p>  \u041e\u0442\u043c\u0435\u0442\u0438\u043c \u043e\u0442\u043b\u0438\u0447\u0438\u044f <b>std::atomic<\/b> \u0438 <b>volatile <\/b>\u0432 C++11: <a href=\"http:\/\/www.drdobbs.com\/parallel\/volatile-vs-volatile\/212701484\">www.drdobbs.com\/parallel\/volatile-vs-volatile\/212701484<\/a><br \/>  \u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c 3 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u044f:  <\/p>\n<ol>\n<li><b>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/b>: \u0414\u043b\u044f std::atomic&lt;T&gt; a; \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0434\u0432\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0434\u043b\u044f volatile T a; <br \/>   \u2022 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043b\u0438\u044f\u043d\u0438\u044f: a = 10; a = 20; \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u043d\u0430 a = 20;<br \/>   \u2022 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043c\u0435\u043d\u044b \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439: a = 1; local = a; \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c a = 1; local = 1;<\/li>\n<li><b>\u041f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435<\/b>: \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 std::atomic&lt;T&gt; a; \u043c\u043e\u0433\u0443\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0435\u0431\u044f \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438 std::memory_order_\u2026 \u041d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, volatile T a; \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (non-atomic\/non-volatile), \u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a\u043e \u0432\u0441\u0435\u043c volatile-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0442.\u0435. \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u0434\u0432\u0443\u0445 volatile-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c.<\/li>\n<li><b>Spilling<\/b>: \u0411\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438 std::memory_order_release, std::memory_order_acq_rel, std::memory_order_seq_cst \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 std::atomic&lt;T&gt; a; \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u044e\u0442 spilling \u0432\u0441\u0435\u0445 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0434\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0422.\u0435. \u044d\u0442\u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u044e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c\/\u043a\u044d\u0448, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430 100% \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445.<\/li>\n<\/ol>\n<p>  \u0415\u0441\u0442\u044c \u0438 \u043e\u0434\u043d\u043e \u043e\u0431\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 std::atomic \u0438 volatile: \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u043f\u0430\u043c\u044f\u0442\u0438\/\u043a\u044d\u0448\u0443, \u0442.\u0435. \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<br \/>  \u0422\u0430\u043a \u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445(ordinary) \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (non-atomic\/non-volatile) \u2013 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043b\u044e\u0431\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043b\u044e\u0431\u044b\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c.<br \/>  \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430\u0434 atomic-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0441 \u0431\u0430\u0440\u044c\u0435\u0440\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 std::memory_order_release, std::memory_order_acq_rel \u0438 std::memory_order_seq_cst \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442 spilling (\u0437\u0430\u043f\u0438\u0441\u044c \u0438\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c) \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435\u0445 non-atomic\/non-volatile \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Register_allocation#Spilling\">en.wikipedia.org\/wiki\/Register_allocation#Spilling<\/a><\/p>\n<h2><b>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/b><\/h2>\n<p>  \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043c\u0435\u043d\u044f\u044e\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. <br \/>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 GCC \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 x86_64: <a href=\"https:\/\/godbolt.org\/g\/n91hpt\">godbolt.org\/g\/n91hpt<\/a><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f31\/f71\/4e6\/f31f714e62fad1a8f2046cffab9e2296.jpg\" alt=\"image\"\/><br \/>  \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435: <a href=\"https:\/\/hsto.org\/files\/3d2\/18b\/c7b\/3d218bc7b3584f82820f92077096d7a0.jpg\">hsto.org\/files\/3d2\/18b\/c7b\/3d218bc7b3584f82820f92077096d7a0.jpg<\/a><\/p>\n<p>  \u041a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435:  <\/p>\n<ol>\n<li><b>\u041f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c GCC 7.0:<\/b><br \/>   \u2022 \u041c\u0435\u043d\u044f\u0435\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c b = 5; \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 int tmp_c = c;. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u00abc\u00bb, \u0430 \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0434\u043e\u043b\u0433\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 (pipeline) \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 b = 5;, \u0442.\u043a. \u044d\u0442\u0438 2 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430.<br \/>   \u2022 \u0421\u043e\u0432\u043c\u0435\u0449\u0430\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 int tmp_a = a; \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f tmp_c = tmp_c + tmp_a; \u2013 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0432\u0443\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 add eax, a[rip]<\/li>\n<li><b>\u041f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c x86_64:<\/b><br \/>   \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c mov b[rip], 5 \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u043e\u0432\u043c\u0435\u0449\u0435\u043d\u043d\u043e\u0435 \u0441\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c add eax, a[rip].<br \/>   \u0418\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0432 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 mov b[rip], 5 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u2013 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 5 \u0438 \u0430\u0434\u0440\u0435\u0441 b[rip] \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c Store-buffer, \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0430\u0434\u0440\u0435\u0441 b[rip] \u0432\u043e \u0432\u0441\u0435\u0445 \u044f\u0434\u0440\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0442 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u0430, \u0437\u0430\u0442\u0435\u043c CPU-Core-0 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u00abeXclusive\u00bb \u0434\u043b\u044f \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 b[rip], \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 5 \u0438\u0437 Store-buffer \u0432 \u044d\u0442\u0443 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u044e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 b[rip]. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445 \u043a\u044d\u0448-\u043a\u043e\u0433\u0435\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 x86_64 MOESI\/MESIF \u2013 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0438\u0434\u043d\u044b \u0432\u0441\u0435\u043c \u044f\u0434\u0440\u0430\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e: <a href=\"https:\/\/en.wikipedia.org\/wiki\/MESIF_protocol\">en.wikipedia.org\/wiki\/MESIF_protocol<\/a><br \/>   \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0436\u0434\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u2013 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a 5 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u043e \u0432 Store-Buffre, \u043d\u0435 \u0434\u043e\u0436\u0438\u0434\u0430\u044f\u0441\u044c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u044d\u0448, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438: \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 x86_64.<br \/>   Intel 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C &#038; 3D): System Programming Guide: <a href=\"https:\/\/www-ssl.intel.com\/content\/dam\/www\/public\/us\/en\/documents\/manuals\/64-ia-32-architectures-software-developer-system-programming-manual-325384.pdf\">www-ssl.intel.com\/content\/dam\/www\/public\/us\/en\/documents\/manuals\/64-ia-32-architectures-software-developer-system-programming-manual-325384.pdf<\/a><br \/> <br \/>\n<blockquote><p>8.2.3.4 Loads May Be Reordered with Earlier Stores to Different Locations<br \/>   The Intel-64 memory-ordering model allows a load to be reordered with an earlier store to a different location. However, loads are not reordered with stores to the same location.<\/p><\/blockquote>\n<\/li>\n<\/ol>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 x86_64 \u0438\u043c\u0435\u044e\u0442 strong memory model. \u0410 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u0438\u043c\u0435\u044e\u0449\u0438\u0435 weak memory model, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, PowerPC \u0438 ARM v7 \/ v8 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0439.<br \/>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0445 <b>ordinary<\/b>-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, <b>volatile<\/b>-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 <b>atomic<\/b>-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<br \/>  \u041f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/644\/14e\/f9d\/64414ef9db4b116d1200e366df6b7aee.jpg\" alt=\"image\"\/><br \/>  \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c, \u0442.\u043a. \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0435\u0433\u043e \u0441\u043c\u044b\u0441\u043b \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u041d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0442\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. <\/p>\n<p>  \u0415\u0441\u043b\u0438 2 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 volatile, \u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/09c\/d3c\/82f\/09cd3c82f5179496bb6a2ae31a721284.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0439 \u2013 \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\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e atomic-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438 <b>std::memory_order_seq_cst<\/b>):<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/630\/a55\/769\/630a55769ff98887a9ae924b36816c11.jpg\" alt=\"image\"\/><br \/>  \u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<br \/>  \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0431\u0430\u0440\u044c\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 std::memory_order_seq_cst, \u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u0438\u043b\u0438 \u043d\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 (\u043d\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u2013 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435). <br \/>  \u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 a \u0438 b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 a_at \u0438 b_at, \u0438 \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f. \u0422\u0430\u043a \u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c b_at \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c a_at. \u0410 \u0432\u043e\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 a \u0438 b \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.<br \/>  \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u00ab\u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f\u00bb \u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0433\u0443\u0442, \u043d\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u042d\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0440\u0435\u0448\u0438\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 C++-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438\u043b\u0438 CPU \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<br \/>  \u041d\u0438\u0436\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u0430\u0431\u044b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u0432 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445 \u2013 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 \u043b\u0443\u0447\u0448\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0432\u044b\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h2><b>\u0411\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043f\u0430\u043c\u044f\u0442\u0438<\/b><\/h2>\n<p>  \u041c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 C++11 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u043c 6 \u0442\u0438\u043f\u043e\u0432 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 CPU \u0434\u043b\u044f \u0432\u043d\u0435\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (speculative execution), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u0445 \u043c\u044b \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445. \u042d\u0442\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434. \u0410 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430. <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/atomic\/memory_order\">en.cppreference.com\/w\/cpp\/atomic\/memory_order<\/a>  <\/p>\n<pre><code class=\"cpp\">enum memory_order {     memory_order_relaxed,     memory_order_consume,     memory_order_acquire,     memory_order_release,     memory_order_acq_rel,     memory_order_seq_cst };<\/code><\/pre>\n<ul>\n<li><b>memory_order_consume.<\/b> \u0421\u0440\u0430\u0437\u0443 \u0437\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0431\u0430\u0440\u044c\u0435\u0440 memory_order_consume \u043c\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0442.\u043a. \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 \u0435\u0441\u0442\u044c \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u044f \u043e \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u2013 \u0446\u0438\u0442\u0430\u0442\u0430 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430: <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 \/> <br \/>\n<blockquote><p>\u00a729.3<br \/>   (1.3) \u2014 memory_order_consume: a load operation performs a consume operation on the affected memory location. [ Note:<b> Prefer memory_order_acquire<\/b>, which provides stronger guarantees than memory_order_consume. Implementations have found it infeasible to provide performance better than that of memory_order_acquire. Specification revisions are under consideration. \u2014 end note ] <\/p><\/blockquote>\n<\/li>\n<li><b>memory_order_acq_rel.<\/b> \u0422\u0430\u043a \u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0431\u0430\u0440\u044c\u0435\u0440 memory_order_acq_rel \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 RMW (Read-Modify-Write) \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a: compare_exchange_weak()\/_strong(), exchange(), fetch_(add, sub, and, or, xor) \u0438\u043b\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432: <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/atomic\/atomic\">en.cppreference.com\/w\/cpp\/atomic\/atomic<\/a><\/li>\n<\/ul>\n<p>  \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 4 \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c: acquire \u2013 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f store(), \u0430 release \u2014 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f load().<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/64c\/422\/198\/64c422198a2c76f6814aa24315c13bed.jpg\" alt=\"image\"\/><br \/>  \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u2013 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u2013 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0447\u0442\u043e \u0441 \u0447\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438, \u0430 \u0447\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442:<br \/>   <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6ca\/3f8\/9b6\/6ca3f89b6ec08634131df0c499ad0f2d.jpg\" alt=\"image\"\/><br \/>  \u0427\u0442\u043e\u0431\u044b 2 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u2013 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043e\u0431\u0435\u0438\u0445 \u044d\u0442\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u043c\u0435\u043d. \u0422.\u043a. \u00abOther any code\u00bb \u2013 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043d\u0435\u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432, \u0442\u043e \u043e\u043d\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0442 \u043b\u044e\u0431\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430. \u041d\u0430 \u043b\u0435\u0432\u043e\u043c-\u043d\u0438\u0436\u043d\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <b>Relaxed-Release-Relaxed<\/b>, \u043a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u2013 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e \u0432 \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043d\u0438 \u0438\u0434\u0443\u0442. <br \/>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u044d\u0442\u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043e\u043d\u0438 \u0434\u0430\u044e\u0442 \u043d\u0430\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u00abspin-lock\u00bb, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0430\u043c\u0443\u044e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0443\u044e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f Acquire-Release. Spin-lock \u2013 \u044d\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0445\u043e\u0436\u0430\u044f \u043d\u0430 std::mutex.<br \/>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e spin-lock \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0442\u0435\u043b\u0435 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0410 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 spin-lock. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a (mutex, spinlock\u2026) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Acquire-Release \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443, <b>C++11 Standard \u00a7 1.10.1<\/b> (3): <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>\u2026 For example, a call that acquires a mutex will perform an <b>acquire <\/b>operation on the locations comprising the mutex. Correspondingly, a call that releases the same mutex will perform a <b>release<\/b> operation on those same locations. Informally, <u>performing a release operation on A forces prior side effects on other memory locations to become visible to other threads that later perform a consume or an acquire operation on A.<\/u><\/p><\/blockquote>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u043c\u044b\u0441\u043b Acquire-Release \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e: \u043f\u043e\u0442\u043e\u043a-2 \u00abThread-2\u00bb \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <b>flag.load(std::memory_order_acquire)<\/b> \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445\/\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\/\u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u0434\u0430\u0436\u0435 \u043d\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u043c-1 \u00abThread-1\u00bb \u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <b>flag.store(0, std::memory_order_acquire)<\/b>.<br \/>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u043c\u044b\u0441\u043b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a (mutex, spinlock\u2026) \u2013 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0432 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u0442.\u0435. \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u0422\u0430\u043a\u043e\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043a\u043e\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u2013 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0435\u0439. \u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u043e\u0434, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0431\u0435\u0437 std::atomic.<br \/>  \u0411\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438 (memory fences) \u2013 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0438 \u043e\u0434\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0435 \u0432\u044b\u0448\u043b\u0430 \u0437\u0430 \u0435\u0451 \u043f\u0440\u0435\u0434\u0435\u043b\u044b.<br \/>  \u041f\u043e\u0442\u043e\u043a \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u043c \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u2013 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u0442\u043e\u0442 \u0431\u043b\u043e\u043a \u043a\u043e\u0434\u0430, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0436\u0434\u0443\u0442 \u0432 \u0446\u0438\u043a\u043b\u0435 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u0441\u044b\u043f\u0430\u044f). \u041a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043e\u0442\u043f\u0443\u0441\u0442\u0438\u043b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0438\u0437 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442 \u0435\u0451. \u0418 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<br \/>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c 2 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0430:  <\/p>\n<ol>\n<li>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f std::atomic_flag:[19] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/1ec9a0c2b10ce864\">coliru.stacked-crooked.com\/a\/1ec9a0c2b10ce864<\/a><\/li>\n<li>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f std::atomic&lt;int&gt;:[20] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/03c019596b65199a\">coliru.stacked-crooked.com\/a\/03c019596b65199a<\/a><\/li>\n<\/ol>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440-1 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0441\u043c\u044b\u0441\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u2013 \u0441\u043f\u043b\u043e\u0448\u043d\u044b\u043c \u0441\u0438\u043d\u0438\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a5c\/089\/f12\/a5c089f12996e73d320da1e7fec478da.jpg\" alt=\"image\"\/><br \/>  [19] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/1ec9a0c2b10ce864\">coliru.stacked-crooked.com\/a\/1ec9a0c2b10ce864<\/a><br \/>  \u0421\u043c\u044b\u0441\u043b \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u2013 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0430\u0440\u0443\u0436\u0443:  <\/p>\n<ul>\n<li>\u041d\u0438 \u043e\u0434\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435 memory_order_<b>acquire<\/b> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0440\u0430\u043d\u044c\u0448\u0435 \u043d\u0435\u0433\u043e.<\/li>\n<li>\u041d\u0438 \u043e\u0434\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0434\u043e memory_order_<b>release<\/b> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u043d\u0435\u0433\u043e.<\/li>\n<\/ul>\n<p>  \u041b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c (compile-time) \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c (run-time) \u2013 \u0432 \u0446\u0435\u043b\u044f\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. <br \/>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u0440\u043e\u043a\u0430 <b>int new_shared_value = shared_value;<\/b> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e <b>lock_flag.clear(std::memory_order_release);<\/b>. \u0422\u0430\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e \u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 data-races, \u0442.\u043a. \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u043e\u0431\u0449\u0438\u043c \u0434\u043b\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u043c \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0432\u0443\u0445 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 acquire \u0438 release. \u0410 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u2013 \u0438 \u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <b>int new_shared_value = shared_value;<\/b> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c <b>shared_value += 25;<\/b><br \/>  \u0422\u0430\u043a \u0447\u0442\u043e \u0436\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u044e\u0442, \u0438 \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0442 \u0431\u0430\u0440\u044c\u0435\u0440\u044b acquire-release \u0434\u043b\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438:  <\/p>\n<ul>\n<li>\u041b\u044e\u0431\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0439\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 <b>\u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e<\/b> \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438.<\/li>\n<li>\u041b\u044e\u0431\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0439\u0441\u044f \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 <b>\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e<\/b> \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 (\u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438).<\/li>\n<\/ul>\n<p>  \u041a\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0430 std::memory_order:  <\/p>\n<ul>\n<li><b>1, 6<\/b>: \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 Assembler-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 acquire-\u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u0434\u043b\u044f load-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 release-\u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u0434\u043b\u044f store-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0435\u0441\u043b\u0438 \u044d\u0442\u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/li>\n<li><b>2<\/b>: \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043d\u043e\u0432\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u2013 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 load(acquire)<\/li>\n<li><b>5<\/b>: \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0441\u0442\u0430\u043b\u0438 \u0432\u0438\u0434\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u0430\u043c, \u0442.\u0435. \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 spilling (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Register_allocation\">link<\/a>) \u2013 \u0434\u043e store(release)<\/li>\n<li><b>3, 4<\/b>: \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c \u0432 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445 \u2013 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u043a\u0440\u0430\u0441\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438<\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/96b\/a79\/c0b\/96ba79c0bcc392831a41e64d39377108.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 Relaxed-Release \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0432\u043c\u0435\u0441\u0442\u043e Acquire-Release:<br \/>   <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/251\/b6e\/de7\/251b6ede7186788cb1f5f0367ddd8896.jpg\" alt=\"image\"\/>  <\/p>\n<ul>\n<li>\u0421\u043b\u0435\u0432\u0430. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <b>Acquire-Release<\/b> \u0432\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/li>\n<li>\u0421\u043f\u0440\u0430\u0432\u0430. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <b>Relaxed-Release<\/b> \u2013 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u0442.\u043a. \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 critical section, \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u043c\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0430 \u043d\u0430\u0440\u0443\u0436\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c. \u0422\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 Data Races \u2013 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0435\u0449\u0451 \u0434\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0447\u043d\u0443\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u2014 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. <\/li>\n<\/ul>\n<p>  \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043d\u0430\u0434 \u043e\u0431\u0449\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0445 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u0438 \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435 \u0435\u0441\u043b\u0438 \u0438\u0445 \u043c\u043d\u043e\u0433\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0449\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435: \u043e\u0434\u043d\u043e\u0439 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u043b\u0430\u0433 \u00ab\u0437\u0430\u043a\u0440\u044b\u0442\u043e\u00bb, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u043e\u0431\u0449\u0438\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u043b\u0430\u0433 \u00ab\u043e\u0442\u043a\u0440\u044b\u0442\u043e\u00bb.<br \/>  \u041f\u043e\u043a\u0430\u0436\u0435\u043c \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438: <br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/589\/a28\/6f4\/589a286f40175b4d847eaccda08857d8.jpg\" alt=\"image\"\/><\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 add_to_shared().   <\/p>\n<ol>\n<li>\u041f\u043e\u0442\u043e\u043a-1 \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u0447\u0443\u0442\u044c \u0440\u0430\u043d\u044c\u0448\u0435, \u0438 \u043e\u0434\u043d\u043e\u0439 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 test_and_set() \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 2 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438: \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442 \u0435\u0441\u043b\u0438 lock_flag == false, \u0442\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u0435\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 true (\u0442.\u0435. \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 spin-lock), \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 false. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 while(lock_flag.test_and_set()); \u0442\u0443\u0442 \u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043a\u043e\u0434 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438.<\/li>\n<li>\u041f\u043e\u0442\u043e\u043a-2 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0442\u043e\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e test_and_set(): \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0441\u043b\u0438 lock_flag == false, \u0442\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 true, \u0430 \u0438\u043d\u0430\u0447\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 true. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 while(lock_flag.test_and_set()); \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 while(lock_flag);<\/li>\n<li>\u041f\u043e\u0442\u043e\u043a-1 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f shared_value += 25; \u0438 \u0437\u0430\u0442\u0435\u043c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 lock_flag = false (\u0442.\u0435. \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 spin-lock).<\/li>\n<li>\u041f\u043e\u0442\u043e\u043a-2 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0434\u043e\u0436\u0434\u0430\u0432\u0448\u0438\u0441\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f lock_flag == false \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 lock_flag = true, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 false \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0446\u0438\u043a\u043b. \u0417\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 shared_value += 25; \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 lock_flag = false (\u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 spin-lock).<\/li>\n<\/ol>\n<p>  \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u044d\u0442\u043e\u0439 \u0433\u043b\u0430\u0432\u044b \u043c\u044b \u043f\u0440\u0438\u0432\u0435\u043b\u0438 2 \u043f\u0440\u0438\u043c\u0435\u0440\u0430:  <\/p>\n<ol>\n<li>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f std::atomic_flag \u0438 test_and_set():[21] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/1ec9a0c2b10ce864\">coliru.stacked-crooked.com\/a\/1ec9a0c2b10ce864<\/a><\/li>\n<li>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f std::atomic&lt;int&gt; \u0438 compare_exchange_weak():[22] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/03c019596b65199a\">coliru.stacked-crooked.com\/a\/03c019596b65199a<\/a><\/li>\n<\/ol>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/atomic\/atomic\">en.cppreference.com\/w\/cpp\/atomic\/atomic<\/a><br \/>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f x86_64 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c GCC \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2b8\/88f\/52d\/2b888f52db4b8ebe319a5237c7cc5e6a.jpg\" alt=\"image\"\/> <\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441:  <\/p>\n<pre><code class=\"cpp\">class spinlock_t {     std::atomic_flag lock_flag; public:     spinlock_t() { lock_flag.clear(); }      bool try_lock() { return !lock_flag.test_and_set(std::memory_order_acquire); }     void lock() { for (size_t i = 0; !try_lock(); ++i) if (i % 100 == 0) std::this_thread::yield(); }     void unlock() { lock_flag.clear(std::memory_order_release); } };<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <b>spinlock_t <\/b>\u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: [23] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/92b8b9a89115f080\">coliru.stacked-crooked.com\/a\/92b8b9a89115f080<\/a><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0432\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 \u0432\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u043e \u0447\u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 x86_64, \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/64a\/803\/708\/64a80370811061535c03f0f2d4ee8ba3.jpg\" alt=\"image\"\/><br \/>  \u2003<br \/>  \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: <a href=\"https:\/\/hsto.org\/files\/4f8\/7b4\/1b6\/4f87b41b64a54549afca679af1028f84.jpg\">hsto.org\/files\/4f8\/7b4\/1b6\/4f87b41b64a54549afca679af1028f84.jpg<\/a><br \/>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043a\u043e\u0434 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 x86_64, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438:  <\/p>\n<ul>\n<li><b>seq_cst<\/b>. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 (Clang \u0438 MSVC) \u043e\u0442 GCC \u2013 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 Store \u0434\u043b\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 Sequential Consistency, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: a.store(val, memory_order_seq_cst); \u2014 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Clang \u0438 MSVC \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e [LOCK] XCHG reg, [addr], \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0447\u0438\u0449\u0430\u0435\u0442 CPU-Store-buffer \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0430\u0440\u044c\u0435\u0440 MFENCE. \u0410 GCC \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0432\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 MOV [addr], reg \u0438 MFENCE.<\/li>\n<li><b>RMW (CAS, ADD\u2026) always seq_cst<\/b>. \u0422.\u043a. \u0432\u0441\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 RMW (Read-Modify-Write) \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 x86_64 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 LOCK, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0447\u0438\u0449\u0430\u0435\u0442 Store-Buffer, \u0442\u043e \u043e\u043d\u0438 \u0432\u0441\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435 Sequential-Consistency \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u041b\u044e\u0431\u044b\u0435 memory_order \u0434\u043b\u044f RMW \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 memory_order_acq_rel.<\/li>\n<li><b>LOAD(acquire), STORE(release)<\/b>. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043d\u0430 x86_64 \u043f\u0435\u0440\u0432\u044b\u0435 4 \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 (relaxed, consume, acquire, release) \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u2013 \u0442.\u0435. \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 x86_64 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 acquire-release \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u2013 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u044d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438 \u043a\u044d\u0448-\u043a\u043e\u0433\u0435\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 MESIF(Intel) \/ MOESI (AMD). \u042d\u0442\u043e \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043a\u0430\u043a Write Back (\u043d\u043e \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0434\u043b\u044f \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0439 \u043a\u0430\u043a Un-cacheable \u0438\u043b\u0438 Write Combined \u2013 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Mapped Memory Area from Device \u2013 \u0432 \u043d\u0435\u0439 \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\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e Acquire-semantic).<\/li>\n<\/ul>\n<p>  \u041a\u0430\u043a \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u043d\u0438\u0433\u0434\u0435 \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: (Read-X, Write-X) \u0438\u043b\u0438 (Write-X, Read-X)<br \/>  \u0421\u043b\u0430\u0439\u0434\u044b \u0441 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f Herb Sutter \u0434\u043b\u044f x86_64: <a href=\"https:\/\/onedrive.live.com\/view.aspx?resid=4E86B0CF20EF15AD!24884&amp;app=WordPdf&amp;authkey=!AMtj_EflYn2507c\">https:\/\/onedrive.live.com\/view.aspx?resid=4E86B0CF20EF15AD!24884&#038;app=WordPdf&#038;authkey=!AMtj_EflYn2507c<\/a><br \/>  \u2022 \u041d\u0430 x86_64 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b \u043b\u044e\u0431\u044b\u0435:  <\/p>\n<ul>\n<li>Read-X \u2013 Read-Y<\/li>\n<li>Read-X \u2013 Write-Y<\/li>\n<li>Write-X \u2013 Write-Y<\/li>\n<\/ul>\n<p>  \u2022 \u041d\u0430 x86_64 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b \u043b\u044e\u0431\u044b\u0435: Write-X &lt;\u2013&gt; Read-Y. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0430\u0440\u044c\u0435\u0440 std::memory_order_seq_cst, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c 4 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043a\u043e\u0434\u0430 \u043d\u0430 x86_64 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430:  <\/p>\n<ol>\n<li>load: MOV (from memory) store: MOV (to memory), <b>MFENCE<\/b><\/li>\n<li>load: MOV (from memory) store: <b>LOCK <\/b>XCHG (to memory)<\/li>\n<li>load: <b>MFENCE <\/b>+ MOV (from memory) store: MOV (to memory)<\/li>\n<li>load: <b>LOCK <\/b>XADD ( 0, from memory ) store: MOV (to memory)<\/li>\n<\/ol>\n<p>  \u0421\u0432\u043e\u0434\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0434\u043b\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 (x86_64, PowerPC, ARMv7, ARMv8, AArch64, Itanium) \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: <a href=\"http:\/\/www.cl.cam.ac.uk\/~pes20\/cpp\/cpp0xmappings.html\">www.cl.cam.ac.uk\/~pes20\/cpp\/cpp0xmappings.html<\/a><\/p>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b: ARM, ARM64, AVR, PowerPC.<br \/>  GCC 6.1 (x86_64):  <\/p>\n<ul>\n<li>Load \/ Store: <a href=\"https:\/\/godbolt.org\/g\/xq9ulH\">godbolt.org\/g\/xq9ulH<\/a><\/li>\n<li>RMW (fetch_add): <a href=\"https:\/\/godbolt.org\/g\/dp1zZ0\">godbolt.org\/g\/dp1zZ0<\/a><\/li>\n<li>CAS (compare_exchange_weak() \/ compare_exchange_strong()): <a href=\"https:\/\/godbolt.org\/g\/OMuXmz\">godbolt.org\/g\/OMuXmz<\/a><\/li>\n<li>std::atomic_flag::test_and_set(): <a href=\"https:\/\/godbolt.org\/g\/7ksl0J\">godbolt.org\/g\/7ksl0J<\/a><\/li>\n<\/ul>\n<p>  Clang 3.8 (x86_64):  <\/p>\n<ul>\n<li>Load \/ Store: <a href=\"https:\/\/godbolt.org\/g\/gfpeZW\">godbolt.org\/g\/gfpeZW<\/a><\/li>\n<li>RMW (fetch_add): <a href=\"https:\/\/godbolt.org\/g\/afoIQW\">godbolt.org\/g\/afoIQW<\/a><\/li>\n<li>CAS (compare_exchange_weak() \/ compare_exchange_strong()): <a href=\"https:\/\/godbolt.org\/g\/kYXzK6\">godbolt.org\/g\/kYXzK6<\/a><\/li>\n<li>std::atomic_flag::test_and_set(): <a href=\"https:\/\/godbolt.org\/g\/RD5fJG\">godbolt.org\/g\/RD5fJG<\/a><\/li>\n<\/ul>\n<p>  \u0422\u0430\u043a \u0436\u0435 \u043a\u0440\u0430\u0442\u043a\u043e \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u043a\u0430\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e CAS (Compare-and-swap)-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439: <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/atomic\/atomic\/compare_exchange\">en.cppreference.com\/w\/cpp\/atomic\/atomic\/compare_exchange<\/a><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/429\/470\/04d\/42947004d7a535f2f4a886e487b4a3dd.jpg\" alt=\"image\"\/><\/p>\n<h2><b>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043f\u0430\u043c\u044f\u0442\u0438<\/b><\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437 4-\u0435\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439: LOAD, STORE, LOAD, STORE.  <\/p>\n<ul>\n<li><b>\u0421\u0438\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438<\/b> \u2013 \u044d\u0442\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/li>\n<li><b>\u0422\u0435\u043c\u043d\u043e-\u0441\u0438\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438<\/b> \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0432\u0435\u0442\u043b\u043e-\u0441\u0438\u043d\u0438\u0445 (\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 3 \u0438 4) \u2013 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 Read-Modify-Write(RMW) \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439<\/li>\n<li><b>\u0411\u0435\u043b\u044b\u0435 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438<\/b> \u2013 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043d\u0435\u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c 4 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438. \u041d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 1 \u0438 3 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/292\/a97\/b00\/292a97b005473eff1f160134f8c44381.jpg\" alt=\"image\"\/><br \/>   <b>1-\u0439 \u0441\u043b\u0443\u0447\u0430\u0439<\/b> \u2013 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u043a\u0446\u0438\u0439 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0438\u0442\u044b (fused) \u0432 \u043e\u0434\u043d\u0443.<\/p>\n<p>  <b>3-\u0439 \u0441\u043b\u0443\u0447\u0430\u0439<\/b> \u2013 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0442\u0435\u043c, \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u0438 \u0434\u0432\u0443\u0445 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b: STORE A &lt;&#8212;&gt; LOAD B.  <\/p>\n<ul>\n<li>\u042d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 ARM \u0438 PowerPC, \u0433\u0434\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 3-\u0451\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 ASM-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 (ldaxr, add, stlxr), \u0430 \u0438\u0445 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 LL\/SC (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Load-link\/store-conditional\">wiki-link<\/a>), \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: <a href=\"https:\/\/godbolt.org\/g\/gwYdTR\">godbolt.org\/g\/gwYdTR<\/a><\/li>\n<\/ul>\n<p>  <b>2\u0439 \u0441\u043b\u0443\u0447\u0430\u0439<\/b> \u2013 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0442\u0435\u043c, \u0447\u0442\u043e std::memory_order_seq_cst \u0441\u0430\u043c\u044b\u0439 \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 \u0438 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u0438\u043b\u0438 \u043d\u0435\u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0435\u0431\u044f. \u041d\u043e seq_cst-\u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0438\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 acquire\/release \u2013 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043e\u0431\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043c\u0435\u044e\u0442 seq_cst-\u0431\u0430\u0440\u044c\u0435\u0440, \u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 STORE-A(seq_cst); LOAD-B(seq_cst); \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u0430. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c 2 \u0446\u0438\u0442\u0430\u0442\u044b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 C++:  <\/p>\n<ol>\n<li>\u0421\u0442\u0440\u043e\u0433\u0438\u0439 \u0435\u0434\u0438\u043d\u044b\u0439 \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 c \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u043c memory_order_seq_cst, Standard C++11 \u00a7 29.3 (3): <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 \/> <br \/>\n<blockquote><p>There<b> shall be a single total order S on all memory_order_seq_cst operations<\/b>, consistent with the \u201chappens before\u201d order and modification orders for all affected locations, such that each memory_order_seq_cst operation B that loads a value from an atomic object M observes one of the following values: \u2026<\/p><\/blockquote>\n<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0431\u0430\u0440\u044c\u0435\u0440 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u0442 memory_order_seq_cst \u0442\u043e \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 memory_order_seq_cst\u2013\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0432 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445, Standard C++11 \u00a7 29.3 (8): <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 \/> <br \/>\n<blockquote><p>[ Note: <b>memory_order_seq_cst ensures sequential consistency only for a program that is<\/b> free of data races and <b>uses exclusively memory_order_seq_cst operations. Any use of weaker ordering will invalidate this guarantee<\/b> unless extreme care is used. In particular, memory_order_seq_cst fences ensure a total order only for the fences themselves. Fences cannot, in general, be used to restore sequential consistency for atomic operations with weaker ordering specifications. \u2014 end note ]<\/p><\/blockquote>\n<\/li>\n<\/ol>\n<p>  \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u2013seq_cst \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (\u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u0438 \u043d\u0435\u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445) \u0432\u043e\u043a\u0440\u0443\u0433 seq_cst-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u043a\u0430\u043a \u0438 \u0443 acquire\/release:   <\/p>\n<ul>\n<li><b>a.load(memory_order_seq_cst)<\/b> \u2013 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043d\u0435 seq_cst-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u043a\u0430\u043a <b>a.load(memory_order_acquire)<\/b> <\/li>\n<li><b>b.store(memory_order_seq_cst)<\/b> \u2013 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043d\u0435 seq_cst-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u043a\u0430\u043a <b>b.load(memory_order_ release)<\/b><\/li>\n<\/ul>\n<p>  \u0411\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u043d\u043e \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e71\/ca5\/6f3\/e71ca56f3a76e9a7ed549b3bf4066049.jpg\" alt=\"image\"\/><br \/>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 seq_cst \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0434\u043b\u044f acquire \u0438 release: \u043d\u0438\u0447\u0442\u043e \u0438\u0434\u0443\u0449\u0435\u0435 \u0434\u043e STORE(seq_cst) \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e, \u0438 \u043d\u0438\u0447\u0442\u043e \u0438\u0434\u0443\u0449\u0435\u0435 \u043f\u043e\u0441\u043b\u0435 LOAD(seq_cst) \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0434\u043e \u043d\u0435\u0433\u043e. <br \/>  \u041d\u043e \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u043a\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 GCC \u0434\u043b\u044f x86_64 \u0438 PowerPC \u2014 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u043d\u0430 C++ \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 Assembler x86_64 \u0438 PowerPC.<\/p>\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 memory_order_seq_cst\u2013\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439:  <\/p>\n<ol>\n<li><b>\u041d\u0430 x86_64<\/b> \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 Store-Load. \u0422.\u0435. \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c: <br \/> <br \/>\n<blockquote><p><b>STORE-C(release);<\/b> LOAD-B(seq_cst); ==&gt; LOAD-B(seq_cst); <b>STORE-C(release);<\/b><\/p><\/blockquote>\n<p> \u0442.\u043a. \u043d\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 x86_64, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f MFENCE \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 STORE(seq_cst), \u043d\u043e \u0434\u043b\u044f LOAD(seq_cst) \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b \u0434\u043b\u044f LOAD(release) \u0438 LOAD(relaxed): <a href=\"https:\/\/godbolt.org\/g\/BsLqas\">godbolt.org\/g\/BsLqas<\/a> <\/li>\n<li><b>\u041d\u0430 PowerPC<\/b> \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f Store-Load, Store-Store \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u0422.\u0435. \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c: <br \/> <br \/>\n<blockquote><p>STORE-A(seq_cst); <b>STORE-C(relaxed); LOAD-C(relaxed);<\/b> ==&gt; <br \/>  <b>LOAD-C(relaxed); STORE-C(relaxed);<\/b> STORE-A(seq_cst);<\/p><\/blockquote>\n<p>\u0442.\u043a. \u043d\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 PowerPC, \u0434\u043b\u044f seq_cst-\u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f sync (hwsync) \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e STORE(seq_cst) \u0438 \u0434\u043e LOAD(seq_cst), \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 STORE(seq_cst) \u0438 LOAD(seq_cst) \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0441\u044f \u0434\u043e STORE(seq_cst): <a href=\"https:\/\/godbolt.org\/g\/dm7tWd\">godbolt.org\/g\/dm7tWd<\/a><\/li>\n<\/ol>\n<p>  \u041f\u043e\u043a\u0430\u0436\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0437 3 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u043e\u0439: seq_cst \u0438 relaxed.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/37e\/03f\/c6e\/37e03fc6eee179dbfa17dd5735a8678c.jpg\" alt=\"image\"\/><br \/>  \u041a\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 C++  <\/p>\n<ul>\n<li>C++ to ASM for PowerPC: <a href=\"https:\/\/godbolt.org\/g\/mEM8T8\">godbolt.org\/g\/mEM8T8<\/a><\/li>\n<li>C++ to ASM for x86_64: <a href=\"https:\/\/godbolt.org\/g\/lTNMJ2\">godbolt.org\/g\/lTNMJ2<\/a><\/li>\n<\/ul>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e C++-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 assembler-\u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u043c x86_64 \u0438 PowerPC:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/077\/0d6\/ee0\/0770d6ee0621cd122bc14d838092fbda.jpg\" alt=\"image\"\/> <br \/>  \u041a\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 CPU \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 assembler-\u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438. \u201cMemory Barriers: a Hardware View for Software Hackers\u201d Paul E. McKenney June 7, 2010 \u2014 Table 5: <a href=\"http:\/\/www.rdrop.com\/users\/paulmck\/scalability\/paper\/whymb.2010.06.07c.pdf\">www.rdrop.com\/users\/paulmck\/scalability\/paper\/whymb.2010.06.07c.pdf<\/a><\/p>\n<p>  \u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \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, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 4 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 memory_order_seq_cst, \u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0440\u0430\u0437\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<ol>\n<li>\u0415\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a-1 \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u044b\u043c<\/li>\n<li>\u0410 \u043f\u043e\u0442\u043e\u043a-2 \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u044b\u043c<\/li>\n<li>\u0422\u043e \u043f\u043e\u0442\u043e\u043a-3 \u043c\u043e\u0436\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u043c-2, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0442\u0435\u043c \u0443\u0432\u0438\u0434\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u043c-1<\/li>\n<li>\u0410 \u043f\u043e\u0442\u043e\u043a-4 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u043c\u043e\u0436\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u043c-1, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0442\u0435\u043c \u0443\u0432\u0438\u0434\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u043c-2<\/li>\n<\/ol>\n<p>  \u042d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0437-\u0437\u0430 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u044d\u0448-\u043a\u043e\u0433\u0435\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 Load\/Store-\u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0438 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044f\u0434\u0435\u0440 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0432\u0430 \u044f\u0434\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u043e\u043c \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0443\u0432\u0438\u0434\u044f\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u044f\u0434\u0440\u0430\u043c\u0438. \u0427\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0432\u0438\u0434\u0435\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442.\u0435. \u0438\u043c\u0435\u043b\u0438 <b>single total order<\/b> (C++11 \u00a7 29.3 (3)) \u2013 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (LOAD, STORE, RMW) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0441 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438 memory_order_seq_cst: <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/atomic\/memory_order\">en.cppreference.com\/w\/cpp\/atomic\/memory_order<\/a><br \/>  \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 assert(z.load() != 0); \u0442.\u043a. \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438 memory_order_seq_cst: <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/52726a5ad01f6529\">coliru.stacked-crooked.com\/a\/52726a5ad01f6529<\/a><br \/>  \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u043a\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f Acquire-Release \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u0438 \u0434\u043b\u044f Sequential \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0437 4-\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432:  <\/p>\n<ol>\n<li><b>Acuire-Release<\/b>:<br \/>   \u2022 \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445<br \/>   \u2022 \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441 Acquire-Release-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u043e\u0439<\/li>\n<li><b>Sequential<\/b>:<br \/>   \u2022 \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445<br \/>   \u2022 <b>\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e <\/b>\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441 Sequential-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u043e\u0439<\/li>\n<\/ol>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5d4\/e08\/f98\/5d4e08f98ea0cf0581a72f67fe4f76aa.jpg\" alt=\"image\"\/><\/p>\n<h2><b>\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 spin-lock \u0438 recursive-spin-lock<\/b><\/h2>\n<p>  \u041f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a: spin-lock \u0438 recursive-spin-lock.<br \/>  \u0414\u0430\u043b\u0435\u0435 \u044d\u0442\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u0430\u043c \u0434\u043b\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a (row-lock) \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (table-lock) \u2013 \u044d\u0442\u043e \u043f\u043e\u0432\u044b\u0441\u0438\u0442 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u0430 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0442.\u043a. \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0441\u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044f \u0432\u0441\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443.<br \/>  \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0438\u043b\u0438 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u044b, \u043c\u043d\u043e\u0433\u0438\u0435 \u041e\u0421 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u0432. \u0410 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e spin-lock \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u2013 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. <br \/>  \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 spinlock \u2013 \u044d\u0442\u043e + 1 \u0431\u0430\u0439\u0442 \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435(row), \u0438\u043b\u0438 +17 \u0431\u0430\u0439\u0442 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 recursive-spin-lock (1 \u0431\u0430\u0439\u0442 \u0434\u043b\u044f \u0444\u043b\u0430\u0433\u0430 + 8 \u0431\u0430\u0439\u0442 \u0434\u043b\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 + 8 \u0431\u0430\u0439\u0442 \u0434\u043b\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 thread_id).  <\/p>\n<ul>\n<li>\u041c\u044b \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f spinlock: [24] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/92b8b9a89115f080\">coliru.stacked-crooked.com\/a\/92b8b9a89115f080<\/a><\/li>\n<li>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f recursive_spinlock: [25] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/eae6b7da971810a3\">coliru.stacked-crooked.com\/a\/eae6b7da971810a3<\/a><\/li>\n<\/ul>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 recursive_spinlock \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e spinlock \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e recursive_spinlock \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u0442.\u0435. \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f std::recursive_mutex \u0438 std::mutex.<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a:  <\/p>\n<ul>\n<li>spinlock_t \u2013 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0435\u0447\u043d\u0430\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 (deadlock) \u2013 \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: [26] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/d3b93315270fd367\">coliru.stacked-crooked.com\/a\/d3b93315270fd367<\/a><\/li>\n<li>recursive_spinlock_t \u2013 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u2013 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 shared_value = 50: [27] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/875ad2754a007037\">coliru.stacked-crooked.com\/a\/875ad2754a007037<\/a><\/li>\n<\/ul>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 recursive_spinlock_t.<br \/>  \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0435 MSVC 2013, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u0435 \u0438\u0437-\u0437\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 std::this_thread::get_id(): <a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1558211\">connect.microsoft.com\/VisualStudio\/feedback\/details\/1558211<\/a><br \/>  \u041c\u044b \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 recursive_spinlock_t, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043b thread-id \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 __declspec(thread) \u2013 \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 thread_local \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0421++11. \u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0432 MSVC 2013: [28] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/3090a9778d02f6ea\">coliru.stacked-crooked.com\/a\/3090a9778d02f6ea<\/a><br \/>  \u042d\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e MSVC 2013, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e \u043a\u0440\u0430\u0441\u043e\u0442\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u044b \u0434\u0443\u043c\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<br \/>  \u0421\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435) \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0430 \u2013 \u044d\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c, \u043d\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043a\u043e\u0434\u043e\u043c. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u0430\u044e\u0442\u0441\u044f, \u0438 \u043f\u0440\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u0445 recursive_spinlock_t \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0430 spinlock_t \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442 \u043d\u0430\u0432\u0435\u0447\u043d\u043e \u2013 \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435, \u0440\u0435\u0448\u0430\u0442\u044c \u0432\u0430\u043c. <br \/>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0441\u044f safe_ptr&lt;T&gt; \u2013 \u043e\u0431\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b, \u043d\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 recursive_spinlock:  <\/p>\n<pre><code class=\"cpp\">safe_int_spin_recursive-&gt;second++;\t\/\/ spinlock & recursive_spinlock safe_int_spin_recursive-&gt;second = safe_int_spin-&gt;second + 1;    \/\/ only recursive_spinlock<\/code><\/pre>\n<h2><b>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e shared-mutex<\/b><\/h2>\n<p>  \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0432 \u043d\u043e\u0432\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u0445 C++ \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u043d\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u0432: <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/thread\">en.cppreference.com\/w\/cpp\/thread<\/a>  <\/p>\n<ul>\n<li>C++11: mutex, timed_mutex, recursive_mutex, recursive_timed_mutex<\/li>\n<li>C++14: shared_timed_mutex<\/li>\n<li>C++17: shared_mutex<\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fa2\/c18\/178\/fa2c181780b71d5339446fd51028474c.jpg\" alt=\"image\"\/><br \/>  shared_mutex \u2013 \u044d\u0442\u043e \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u0430\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0435\u0441\u043b\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0445 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435. shared_mutex \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u0435 \u0441\u0440\u0430\u0437\u0443, \u0442.\u043a. \u0448\u043b\u0438 \u0441\u043f\u043e\u0440\u044b \u043e \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c std::mutex. <br \/>  \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f shared_mutex \u0441\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0430 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u043e\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u043e\u043b\u0433\u043e \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u2013 \u0442.\u0435. \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u043b\u0433\u043e \u0447\u0438\u0442\u0430\u043b\u0438. \u041f\u0440\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0447\u0442\u0435\u043d\u0438\u044f\u0445 shared_mutex \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u043b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u043b \u043a\u043e\u0434. <br \/>  \u041d\u043e \u0432\u0441\u0435 \u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 shared_mutex \u0441\u0442\u043e\u043b\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0447\u0442\u0435\u043d\u0438\u044f\u0445?<br \/>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b std::shared_mutex \u0438 boost::shared_mutex \u2013 \u044d\u0442\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439. \u041a\u0430\u0436\u0434\u044b\u0439 \u0447\u0438\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043f\u0440\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u043f\u0440\u0438 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0433\u043e\u043d\u044f\u044e\u0442 \u043c\u0435\u0436\u0434\u0443 \u044f\u0434\u0440\u0430\u043c\u0438 \u043e\u0434\u043d\u0443 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u044e (\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0433\u043e\u043d\u044f\u044e\u0442 \u0435\u0451 exclusive-state (E)). \u041f\u043e \u043b\u043e\u0433\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0438\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0435\u0433\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u043d\u043e \u044d\u0442\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0447\u0438\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u0442.\u043a. \u0435\u043c\u0443 \u0432\u0430\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f. \u041f\u0440\u0438\u0447\u0435\u043c, \u0442.\u043a. \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0438 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u2013 \u044d\u0442\u043e RMW \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0442\u043e \u043e\u043d\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043e\u0447\u0438\u0441\u0442\u043a\u0443 Store-Buffer (MFENCE x86_64) \u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 x86_64 asm \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0430\u043c\u043e\u0439 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435 Sequential Consistency.<br \/>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<br \/>  \u0415\u0441\u0442\u044c \u0442\u0438\u043f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a write contention-free \u2013 \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0442 \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u0410 \u0432 \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2013 \u043d\u0435\u0442 \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u0438 \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0448 shared-mutex \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a\u0430\u043a write contention-free, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u043c\u0435\u0448\u0430\u043b\u0438 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443 \u2013 \u0442.\u0435. \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043f\u0438\u0441\u0430\u043b \u0444\u043b\u0430\u0433 (\u0447\u0442\u043e \u043e\u043d \u0447\u0438\u0442\u0430\u0435\u0442) \u0432 \u0441\u0432\u043e\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443, \u0438 \u0441\u043d\u0438\u043c\u0430\u043b \u0444\u043b\u0430\u0433 \u0432 \u044d\u0442\u043e\u0439 \u0436\u0435 \u044f\u0447\u0435\u0439\u043a\u0435 \u043f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044e \u0447\u0442\u0435\u043d\u0438\u044f \u2013 \u0431\u0435\u0437 RMW-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. <br \/>  Write contention-free \u2013 \u044d\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435, \u0447\u0435\u043c wait-free \u0438 \u0447\u0435\u043c lock-free.<br \/>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0430\u0441\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u0438 \u0434\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f false-sharing, \u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438 \u0447\u0442\u043e\u0431\u044b \u044f\u0447\u0435\u0439\u043a\u0438 \u043b\u0435\u0436\u0430\u043b\u0438 \u043f\u043b\u043e\u0442\u043d\u043e \u043f\u043e 16 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u0438 \u2013 \u043f\u043e\u0442\u0435\u0440\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 CPU \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0414\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f false-sharing \u2014  \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u0438, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 C++17 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u0441\u043d\u0442\u0440\u0443\u043a\u0446\u0438\u044f alignas(std::hardware_destructive_interference_size), \u0430 \u0432 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 char tmp[60]; (\u043d\u0430 x86_64 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u0438 64 \u0431\u0430\u0439\u0442\u0430):  <\/p>\n<pre><code class=\"cpp\">\/\/struct cont_free_flag_t { \/\/  alignas(std::hardware_destructive_interference_size) std::atomic&lt;int&gt; value;  \/\/ C++17 \/\/ }; struct cont_free_flag_t {      char tmp[60]; std::atomic&lt;int&gt; value;    \/\/ tmp[] to avoid false sharing };<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0444\u043b\u0430\u0433\u0430, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0441\u0442\u044c \u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u2013 \u0442.\u0435. \u0435\u0441\u0442\u044c \u043b\u0438 \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430. \u0410 \u0442.\u043a. shared-mutex \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u0439, \u0442\u043e \u0432\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u044f\u0434\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043a\u043e\u043f\u0438\u044e \u044d\u0442\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443 \u0441\u0435\u0431\u044f \u0432 \u043a\u044d\u0448-L1 \u0432 shared-state (S) \u043e\u0442\u043a\u0443\u0434\u0430 \u0437\u0430 3 \u0442\u0430\u043a\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u043b\u0430\u0433\u0430 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f, \u043f\u043e\u043a\u0430 \u043e\u043d \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f.<br \/>  \u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0444\u043b\u0430\u0433 want_x_lock \u2013 \u043e\u043d \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c. \u041f\u043e\u0442\u043e\u043a\u0438 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0438 \u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 \u0438 \u0441\u043d\u0438\u043c\u0430\u044e\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f RMW-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.  <\/p>\n<pre><code class=\"cpp\">lock(): while(!want_x_lock.compare_exchange_weak(flag, true, std::memory_order_acquire))<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"cpp\">unlock(): want_x_lock.store(false, std::memory_order_release);<\/code><\/pre>\n<p>  \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u043c\u0435\u0448\u0430\u043b\u0438 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0432\u043e\u0438\u0445 shared-\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412\u044b\u0434\u0435\u043b\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0434 \u044d\u0442\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0432\u043d\u044b\u043c 20. \u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 lock_shared() \u043f\u043e\u0442\u043e\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u2013 \u0437\u0430\u043d\u0438\u043c\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435. \u0415\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0442\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 lock_shared() \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u0443\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u0442\u043e\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e, \u0430 \u0432\u0440\u0435\u043c\u044f, \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043d\u0430 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u043b\u0438\u043a\u043e, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u0447\u0442\u043e\u0436\u043d\u043e \u043c\u0430\u043b\u043e.<br \/>  \u0423\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u043d\u0435\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u2013 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0435\u0440\u043d\u043e, \u0430 \u0434\u0430\u043b\u0435\u0435 \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<br \/>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u043c\u0435\u0448\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443: [30] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/b78467b7a3885e5b\">coliru.stacked-crooked.com\/a\/b78467b7a3885e5b<\/a>  <\/p>\n<ol>\n<li><u>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/u> \u042d\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 shared-lock \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e: assert(readonly_safe_map_string-&gt;at(\u00abapple\u00bb) == readonly_safe_map_string-&gt;at(\u00abpotato\u00bb)); \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u043e\u0438\u0445 \u0441\u0442\u0440\u043e\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u044b, \u0442.\u043a. \u043c\u044b \u043c\u0435\u043d\u044f\u0435\u043c 2 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 std::map \u043f\u043e\u0434 \u043e\u0434\u043d\u043e\u0439 eXclusive-\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439 std::lock_guard<\/li>\n<li><u>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043c\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e lock_shared().<\/u> \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0446\u0438\u043a\u043b \u0434\u043e \u0434\u0432\u0443\u0445 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u0443\u0431\u0435\u0440\u0435\u043c \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 std::map \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 main(). \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u044b\u0432\u043e\u0434 \u0431\u0443\u043a\u0432\u044b S \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e lock_shared(), \u0438 \u0431\u0443\u043a\u0432\u044b X \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e lock(). \u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0443\u0442 \u0434\u0432\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 X, \u0430 \u0437\u0430\u0442\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u043a\u0432\u044b S \u2013 \u0437\u043d\u0430\u0447\u0438\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u044f\u0445 const-\u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c shared_lock():[31] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/515ba092a46135ae\">coliru.stacked-crooked.com\/a\/515ba092a46135ae<\/a><\/li>\n<li><u>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043c\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e lock().<\/u> \u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u043a\u0432\u044b X: [32] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/882eb908b22c98d6\">coliru.stacked-crooked.com\/a\/882eb908b22c98d6<\/a><\/li>\n<\/ol>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2013 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0432 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0433\u043b\u043e \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439:  <\/p>\n<ol>\n<li>\u041b\u044e\u0431\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 lock_shared(), \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u044b\u0442\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c lock() \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435<\/li>\n<li>\u041e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b lock(), \u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u044b\u0442\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c lock_shared() \u0438\u043b\u0438 lock() \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435<\/li>\n<\/ol>\n<p>  \u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ae9\/8bd\/c13\/ae98bdc1321409338f78734b40791a56.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0448\u0435\u0433\u043e contention_free_shared_mutex \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 2 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:  <\/p>\n<ul>\n<li><b>T1-read &#038; T2-read:<\/b> \u041f\u043e\u0442\u043e\u043a\u0438-\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f lock_shared() \u2013 \u044d\u0442\u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443 \u043d\u0435 \u043c\u0435\u0448\u0430\u044e\u0442, \u0442.\u043a. \u043f\u0438\u0448\u0443\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u0438 \u0432 \u044d\u0442\u043e\u043c \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u0430-\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f (want_x_lock == false). \u0417\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u044f\u0447\u0435\u0435\u043a \u2013 \u0442\u043e\u0433\u0434\u0430 \u0434\u0430\u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0438-\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f CAS-\u0444\u0443\u043d\u043a\u0446\u0438\u044e: want_x_lock = true.<\/li>\n<li><b>T1-write &#038; T2-write:<\/b> \u041f\u043e\u0442\u043e\u043a\u0438-\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0437\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0444\u043b\u0430\u0433 (want_x_lock) \u0438 \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 true, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0443\u044e CAS-\u0444\u0443\u043d\u043a\u0446\u0438\u044e: want_x_lock.compare_exchange_weak(); \u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a \u0438 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c recursive_spinlock_t, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u044b\u0448\u0435.<\/li>\n<li><b>T1-read &#038; T2-write:<\/b> \u041f\u043e\u0442\u043e\u043a-\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c T1 \u043f\u0438\u0448\u0435\u0442 \u0444\u043b\u0430\u0433 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 \u0441\u0432\u043e\u044e \u044f\u0447\u0435\u0439\u043a\u0443, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043b\u0438 \u0444\u043b\u0430\u0433 (want_x_lock), \u0438 \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d (true), \u0442\u043e \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443, \u0437\u0430\u0442\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (want_x_lock == false) \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430. <\/li>\n<\/ul>\n<p>  \u041f\u043e\u0442\u043e\u043a-\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c T2 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 (want_x_lock = true), \u0430 \u0437\u0430\u0442\u0435\u043c \u0436\u0434\u0435\u0442 \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438-\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0441\u043d\u0438\u043c\u0443\u0442 \u0444\u043b\u0430\u0433\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 \u044f\u0447\u0435\u0435\u043a.<br \/>  \u041f\u043e\u0442\u043e\u043a-\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 \u0438\u043c\u0435\u0435\u0442 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442, \u0447\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c. \u0418 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0441\u0432\u043e\u0438 \u0444\u043b\u0430\u0433\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a, \u0442\u043e \u043f\u043e\u0442\u043e\u043a-\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0441\u0442\u044c \u043b\u0438 \u043f\u043e\u0442\u043e\u043a-\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c (want_x_lock == true), \u0438 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443. \u041f\u043e\u0442\u043e\u043a-\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u043e\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u044d\u0442\u0438\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435 Sequential Consistency (std::memory_order_seq_cst).<br \/>  \u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0434\u0432\u0443\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f) \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5b2\/3a3\/23b\/5b23a323b6a1c9e13ade90bbd82ed98b.jpg\" alt=\"image\"\/><br \/>  \u0412 \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435: <a href=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5b2\/3a3\/23b\/5b23a323b6a1c9e13ade90bbd82ed98b.jpg\">habrastorage.org\/getpro\/habr\/post_images\/5b2\/3a3\/23b\/5b23a323b6a1c9e13ade90bbd82ed98b.jpg<\/a><\/p>\n<p>  \u0412 \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 lock_shared() \u0438 lock(), \u0434\u043b\u044f \u043e\u0431\u0435\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 1. \u0438 2. \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <b>std::memory_order_seq_cst<\/b> \u2014 \u0442.\u0435. \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (single total order).<\/p>\n<h2><b>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0442\u043c\u0435\u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 cont-free shared-mutex<\/b><\/h2>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u043e\u043a \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0435, \u0442\u043e \u043e\u043d \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0410 \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f, \u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043e\u0442\u043c\u0435\u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438.<br \/>  \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0441 \u043d\u0430\u0448\u0438\u043c \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u043c \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 20 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0437\u0430\u0442\u0435\u043c \u044d\u0442\u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u0441\u044f, \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e\u0442 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0435 20 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0440\u0430\u0432\u0435\u043d 20: [33] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/f1ac55beedd31966\">coliru.stacked-crooked.com\/a\/f1ac55beedd31966<\/a><br \/>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u043f\u0435\u0440\u0432\u044b\u0435 20 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c, \u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 20 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 (register_thread = -1) \u0438 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0431\u044b\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u0443\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 20 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0443\u0436\u0435 \u0443\u0434\u0430\u043b\u0438\u043b\u0438\u0441\u044c \u0438 \u0443\u0436\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443.<br \/>  \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u2013 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0442\u043c\u0435\u043d\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u0430, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u043e\u043a \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0442\u0430\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a, \u0442\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u043e\u0442\u043c\u0435\u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0430\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u0445. \u0410 \u0435\u0441\u043b\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u044b, \u0442\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u0437-\u0437\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0432 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0435. <\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440: [34] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/4172a6160ca33a0f\">coliru.stacked-crooked.com\/a\/4172a6160ca33a0f<\/a><br \/>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c 20 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u0445 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 20 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043e\u043d\u0438 \u0442\u0430\u043a\u0436\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u2013 \u043f\u043e\u0434 \u0442\u0435\u043c\u0438 \u0436\u0435 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 register_thread = 0 \u2013 19 (\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432\u044b\u0432\u043e\u0434(output) \u043f\u0440\u0438\u043c\u0435\u0440\u0430).<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439, \u0430 \u0437\u0430\u0442\u0435\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0430, \u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u0437-\u0437\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0432 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438: [35] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/d2e5a4ba1cd787da\">coliru.stacked-crooked.com\/a\/d2e5a4ba1cd787da<\/a><br \/>  \u041c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u044b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438\u0441\u044c 20 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0430\u0448\u0443 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0438 \u0437\u0430\u0441\u043d\u0443\u043b\u0438 \u043d\u0430 500ms, \u0430 \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0435\u0440\u0435\u0437 100ms \u0443\u0434\u0430\u043b\u0438\u043b\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 contfree_safe_ptr \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u043d\u0430\u0448\u0443 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 contention_free_shared_mutex, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u043d\u0443\u043b\u0438\u0441\u044c 20 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c. \u041f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0438\u0445 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u0437-\u0437\u0430 \u043e\u0442\u043c\u0435\u043d\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438.<br \/>  \u041a\u0430\u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 MSVS2013, \u0447\u0442\u043e\u0431\u044b \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u044b \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0442\u043e\u0436\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043d\u043e \u0431\u0435\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043c\u0435\u043d\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u0442\u043e\u043a\u0430.<br \/>  \u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0447\u0442\u0435\u043d\u044b \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043c\u044b\u0441\u043b\u0438.<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440: [36] <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/0a1007765f13aa0d\">coliru.stacked-crooked.com\/a\/0a1007765f13aa0d<\/a><\/p>\n<h2><b>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u0432<\/b><\/h2>\n<p>  \u0412\u044b\u0448\u0435 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<br \/>  \u042d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 lock() \/ unlock() \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 recursive_spinlock_t, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0451 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<br \/>  \u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044e \u043f\u043e\u0442\u043e\u043a\u0430-\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0437\u0430 lock_shared() \u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f \u0437\u0430 lock() \u043c\u044b \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u044b\u0448\u0435.<br \/>  \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e lock_shared() \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c Acquire-semantic, \u0430 unlock_shared() \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c Release-semantic. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438\u0438\/\u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/faf\/4c1\/75b\/faf4c175b21d5e4b890a7045e72b7b79.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u044d\u0442\u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435.<\/p>\n<p>  \u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u0434\u043b\u044f <b>lock_shared()<\/b> \u2013 \u043a\u0440\u0430\u0441\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u043c\u0438 \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/bf0\/a21\/091\/bf0a2109192641cac4f1890fe7dbc4f9.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u0434\u043b\u044f <b>unlock_shared()<\/b>:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/baf\/15d\/688\/baf15d688e3fae2968eb2fe1f06083fc.jpg\" alt=\"image\"\/><br \/>  \u0412 \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440: <a href=\"https:\/\/hsto.org\/files\/065\/9ce\/bd7\/0659cebd72424256b6254c57d35c7d07.jpg\">hsto.org\/files\/065\/9ce\/bd7\/0659cebd72424256b6254c57d35c7d07.jpg<\/a><br \/>  \u0412 \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441 \u0440\u0430\u0437\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438: <a href=\"https:\/\/hsto.org\/files\/fa7\/4d2\/2b7\/fa74d22b7cda4bf4b1015ee263cad9ee.jpg\">hsto.org\/files\/fa7\/4d2\/2b7\/fa74d22b7cda4bf4b1015ee263cad9ee.jpg<\/a><\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u0442\u0430\u043a\u0436\u0435 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0443 \u044d\u0442\u043e\u0439 \u0436\u0435 \u0441\u0430\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 lock_shared()<br \/>   <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c16\/eca\/6a7\/c16eca6a73904282017f80dbf17cee9a.jpg\" alt=\"image\"\/><br \/>  \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435: <a href=\"https:\/\/hsto.org\/files\/c3a\/abd\/4e7\/c3aabd4e7cfa4e9db55b2843467d878f.jpg\">hsto.org\/files\/c3a\/abd\/4e7\/c3aabd4e7cfa4e9db55b2843467d878f.jpg<\/a><br \/>  \u0412 \u043e\u0432\u0430\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439:  <\/p>\n<ol>\n<li>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u2013 \u043a\u0440\u0430\u0441\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c<\/li>\n<li>\u0417\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u2013 \u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c<\/li>\n<\/ol>\n<p>  \u0417\u0435\u043b\u0435\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442.\u043a. \u044d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043d\u0430\u0448 \u00abshared-mutex\u00bb, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u2013 \u044d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0430\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0422.\u0435. \u044d\u0442\u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u0445\u043e\u0434\u043e\u043c \u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443.<\/p>\n<p>  \u0422.\u043a. \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f 2 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u2013 \u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 side-effects \u043e\u0442 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0443\u0447\u0442\u0435\u043d\u044b:  <\/p>\n<ol>\n<li>\u041c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e \u0432\u0445\u043e\u0434\u0435 \u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u043d\u0435 \u043d\u0438\u0436\u0435 \u00abacquire\u00bb:<br \/>   \u2022 want_x_lock.load(std::memory_order_seq_cst)<br \/>   \u2022 want_x_lock.compare_exchange_weak(flag, true, std::memory_order_seq_cst)<\/li>\n<li>\u0412\u0441\u0435\u0433\u0434\u0430 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 <b>\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c<\/b> (1-\u043a\u0440\u0430\u0441\u043d\u044b\u043c), \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e <b>\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c<\/b> (2-\u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u043c) \u043c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u0432\u043e\u0439\u0442\u0438 \u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443. \u0418 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 \u044d\u0442\u0438 \u0434\u0432\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b.<\/li>\n<\/ol>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.<br \/>  \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u00abcontention_free_shared_mutex\u00bb \u0431\u043e\u043b\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<h2><b>\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/b><\/h2>\n<p>  \u041f\u043e\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f contention_free_shared_mutex&lt;&gt; \u043d\u0430 C++ \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u044b\u0441\u043e\u043a\u043e-\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e shared_mutex.<br \/>  \u0421\u043a\u0430\u0447\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0434\u043b\u044f Linux (GCC 6.3.0) \u0438 Windows (MSVS 2015\/13) \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: <a href=\"https:\/\/github.com\/AlexeyAB\/object_threadsafe\/tree\/master\/contfree_shared_mutex\">github.com\/AlexeyAB\/object_threadsafe\/tree\/master\/contfree_shared_mutex<\/a><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 Clang++ 3.8.0 \u043f\u043e\u0434 Linux \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c Makefile.<\/p>\n<pre><code class=\"cpp\">#include &lt; iostream &gt; #include &lt; thread &gt; #include &lt; vector &gt; #include &quot;safe_ptr.h&quot;  template &lt; typename T &gt; void func(T &s_m, int &a, int &b) { \tfor (size_t i = 0; i &lt; 100000; ++i) \t{ \t\t\/\/ x-lock for modification \t\t{ \t\t\ts_m.lock(); \t\t\ta++;  \t\t\tb++; \t\t\ts_m.unlock(); \t\t}  \t\t\/\/ s-lock for reading \t\t{ \t\t\ts_m.lock_shared(); \t\t\tassert(a == b);\t\t\/\/ will never happen \t\t\ts_m.unlock_shared(); \t\t} \t} }  int main() {  \tint a = 0; \tint b = 0; \tsf::contention_free_shared_mutex&lt; &gt; s_m; \t \t\/\/ 19 threads \tstd::vector&lt; std::thread &gt; vec_thread(20); \tfor (auto &i : vec_thread) i = std::move(std::thread([&]() { func(s_m, a, b); })); \tfor (auto &i : vec_thread) i.join(); \t \tstd::cout &lt;&lt; &quot;a = &quot; &lt;&lt; a &lt;&lt; &quot;, b = &quot; &lt;&lt; b &lt;&lt; std::endl; \tgetchar();  \treturn 0; }<\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0435: <a href=\"http:\/\/coliru.stacked-crooked.com\/a\/11c191b06aeb5fb6\">coliru.stacked-crooked.com\/a\/11c191b06aeb5fb6<\/a><br \/>  \u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u043d\u0430\u0448 \u043c\u044c\u044e\u0442\u0435\u043a\u0441 sf::contention_free_shared_mutex&lt;&gt; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0430\u043a \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 std::shared_mutex.<\/p>\n<h2><b>\u0422\u0435\u0441\u0442: std::shared_mutex VS contention_free_shared_mutex<\/b><\/h2>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 16 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 Intel Xeon E5-2660 v3 2.6 GHz. \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0433\u043e\u043b\u0443\u0431\u0430\u044f \u0438 \u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u0438:   <\/p>\n<ul>\n<li>safe_ptr&lt;std::map, std::shared_mutex&gt; <\/li>\n<li>contfree_safe_ptr&lt;std::map&gt;<\/li>\n<\/ul>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430: <a href=\"https:\/\/github.com\/AlexeyAB\/object_threadsafe\/tree\/master\/bench_contfree\">github.com\/AlexeyAB\/object_threadsafe\/tree\/master\/bench_contfree<\/a><br \/>  \u041a\u043e\u043c\u0430\u043d\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430:<br \/>   <b>numactl &#8212;localalloc &#8212;cpunodebind=0 .\/benchmark 16<\/b><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d CPU \u043d\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u043d\u0441\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0435, \u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435: <b>.\/benchmark<\/b><br \/>  \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0447\u0442\u0435\u043d\u0438\u044f (shared-lock) \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0438 (exclusive-lock).  <\/p>\n<ul>\n<li>% exclusive locks = (% of write operations)<\/li>\n<li>% shared locks = 100 \u2014 (% of write operations)<\/li>\n<\/ul>\n<p>  (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 std::mutex \u2013 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 exclusive-lock)<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/hsto.org\/files\/3d8\/1c1\/bbd\/3d81c1bbd945413d85eb65be18aa2b0f.png\" alt=\"image\"\/><br \/>  Performance (the bigger \u2013 the better), MOps \u2014 millions operations per second<\/p>\n<ul>\n<li>\u041f\u0440\u0438 0% \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043d\u0430\u0448 shared-mutex (\u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 contfree_safe_ptr&lt;map&gt;) \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 34.60 Mops, \u0447\u0442\u043e <b>\u0432 14 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435<\/b>, \u0447\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 std::shared_mutex (\u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 safe_ptr&lt;map, std::shared_mutex&gt;), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e 2.44 Mops.<\/li>\n<li>\u041f\u0440\u0438 15% \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043d\u0430\u0448 shared-mutex (\u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 contfree_safe_ptr&lt;map&gt;) \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 5.16 Mops, \u0447\u0442\u043e <b>\u0432 7 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435<\/b>, \u0447\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 std::shared_mutex (\u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 safe_ptr&lt;map, std::shared_mutex&gt;), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e 0.74 Mops.<\/li>\n<\/ul>\n<p>  \u041d\u0430\u0448\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u00abcontention-free shared-mutex\u00bb \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432: \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u044b\u0445 36 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043a\u0430\u043a contention-free, \u0430 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043a\u0430\u043a exclusive-lock. \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0438\u0437 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432, \u0434\u0430\u0436\u0435 \u00abexclusive-lock\u00bb std::mutex \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c std::shared_mutex \u043f\u0440\u0438 15% \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<br \/>  \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 36 \u0434\u043b\u044f contention-free \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043c\u0435\u0434\u0438\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a: \u0447\u0442\u0435\u043d\u0438\u044f (shared-lock) \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 (exclusive-lock).<br \/>  \u0412 \u043a\u043e\u0434\u0435 \u0442\u0435\u0441\u0442\u0430 main.cpp \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c: const bool measure_latency = true;<br \/>  \u041a\u043e\u043c\u0430\u043d\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430:<br \/>   <b>numactl &#8212;localalloc &#8212;cpunodebind=0 .\/benchmark 16<\/b><br \/>  \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d CPU \u043d\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u043d\u0441\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0435, \u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435: <b>.\/benchmark<\/b><br \/>  <img decoding=\"async\" src=\"https:\/\/hsto.org\/files\/3ae\/e18\/850\/3aee188503b14363abb9fe0a069ecfa0.png\" alt=\"image\"\/><br \/>  Median-latency (the lower \u2013 the better), microseconds<\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u0443\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u043c\u0435\u0448\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 std::shared_timed_mutex \u0438 boost::shared_mutex. \u041d\u043e \u0443 \u043d\u0430\u0441 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f: 64 \u0431\u0430\u0439\u0442\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a + 24 \u0431\u0430\u0439\u0442\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 unregister_t \u0434\u043b\u044f \u043e\u0442\u043c\u0435\u043d\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 + \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437 hash_map. \u0412 \u0441\u0443\u043c\u043c\u0435 \u043e\u043a\u043e\u043b\u043e 100 \u0431\u0430\u0439\u0442 \u043d\u0430 \u043f\u043e\u0442\u043e\u043a.<br \/>  \u0411\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2013 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c 8 CPU (Intel Xeon Processor E7-8890 v4) \u043f\u043e 24 \u044f\u0434\u0440\u0430 (\u043f\u043e 48 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 HyperThreading), \u0442\u043e \u044d\u0442\u043e \u0432 \u0441\u0443\u043c\u043c\u0435 384 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044f\u0434\u0440\u0430. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a-\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e 24576 \u0431\u0430\u0439\u0442 (\u043f\u043e 64 \u0431\u0430\u0439\u0442 \u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 384 \u044f\u0434\u0435\u0440), \u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u0436\u0434\u0430\u0442\u044c \u043f\u043e\u043a\u0430 \u043e\u0434\u043d\u0430 \u043a\u044d\u0448-\u043b\u0438\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 384 \u043f\u043e\u0442\u043e\u043a\u0430 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443, \u043a\u0430\u043a \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 std::shared_timed_mutex \u0438 boost::shared_mutex (\u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u0442\u0438\u043f\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 unique\/shared). \u041d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 1000 \u044f\u0434\u0435\u0440 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0430 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0437\u043e\u0432 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0412\u0441\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u043c\u044b\u0435 \u0432\u044b\u0448\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b: \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, lock-free \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u2013 \u044d\u0442\u043e \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043d\u0438\u0437\u043a\u0438\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a (0,5 \u2013 5 usec) \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<br \/>  \u0414\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0442.\u0435. \u0434\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 \u0446\u0435\u043b\u043e\u043c \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044f\u0434\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u0430, \u00abhide latency\u00bb \u0438 \u00abbatch processing\u00bb \u2014 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f (\u0434\u043b\u044f map) \u0438\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f (\u0434\u043b\u044f hash_map) \u0438 \u0441\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0441\u044f \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0438\u043b\u0438 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0437\u0430 50 \u2013 500 usec. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0432 10-100 \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u043e \u044d\u0442\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0432 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u00abhide latency\u00bb \u0437\u0430 \u0441\u0447\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u00abFine-grained Temporal multithreading\u00bb.<br \/>  \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c: \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0432 100 \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 10000 \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435. \u042d\u0442\u043e \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 100 \u0440\u0430\u0437 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0439. \u0422\u0430\u043a\u0438\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 GPU. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u044d\u0442\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439.<\/p>\n<h2><b>\u0412\u044b\u0432\u043e\u0434:<\/b><\/h2>\n<p> \u041c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u00abshared-mutex\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043a\u0438-\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c std::shared_mutex. \u041c\u044b \u0441\u0442\u0440\u043e\u0433\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u00abshared-mutex\u00bb. \u0410 \u0442\u0430\u043a \u0436\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u043b\u0438 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libCDS (Concurrent Data Structures library): <a href=\"https:\/\/github.com\/khizmax\/libcds\">github.com\/khizmax\/libcds<\/a><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\/328362\/\"> https:\/\/habrahabr.ru\/post\/328362\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043f\u0430\u043c\u044f\u0442\u0438 C++11 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0438\u043c\u0438 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445 x86_64.<br \/>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u043a \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 <b>contfree_safe_ptr&lt;std::map&gt;<\/b> \u0434\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 <b>lock-free<\/b> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 std::map&lt;&gt;, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: SkipListMap \u0438 BronsonAVLTreeMap \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libCDS (Concurrent Data Structures library): <a href=\"https:\/\/github.com\/khizmax\/libcds\">github.com\/khizmax\/libcds<\/a><br \/>  \u0418 \u0442\u0430\u043a\u0443\u044e \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 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0432\u0430\u0448\u0435\u0433\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0442\u043e\u043a\u043e-<b>\u043d\u0435<\/b>\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 T \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043a\u0430\u043a contfree_safe_ptr&lt;T&gt;. \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 ~1000%, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0443\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u043b\u0430\u0431\u044b\u043c \u0438 \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-286146","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286146","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=286146"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286146\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=286146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=286146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=286146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}