{"id":18936,"date":"2025-07-28T11:14:24","date_gmt":"2025-07-28T11:14:24","guid":{"rendered":"http:\/\/www.max-sperling.bplaced.net\/?p=18936"},"modified":"2025-08-11T10:44:58","modified_gmt":"2025-08-11T10:44:58","slug":"memory-order-for-atomics-c","status":"publish","type":"post","link":"http:\/\/www.max-sperling.bplaced.net\/?p=18936","title":{"rendered":"Memory order for atomics (C++)"},"content":{"rendered":"<h2>Overview<\/h2>\n<table>\n<tr>\n<th>Memory order<\/th>\n<th>Description<\/th>\n<\/tr>\n<tr>\n<td>memory_order_relaxed<\/td>\n<td>Unsafest, No ordering is guaranteed.<\/td>\n<\/tr>\n<tr>\n<td>memory_order_acquire<\/td>\n<td>A load operation, No reads or writes in the current thread can be reordered <b>before<\/b> this load.<\/td>\n<\/tr>\n<tr>\n<td>memory_order_release<\/td>\n<td>A store operation, No reads or writes in the current thread can be reordered <b>after<\/b> this store.<\/td>\n<\/tr>\n<tr>\n<td>memory_order_seq_cst<\/td>\n<td>Default, A load operation does a memory_order_acquire and a store operation does a memory_order_release and a read-modify-write combines both.<\/td>\n<\/tr>\n<tr>\n<td>memory_order_acq_rel<\/td>\n<td>Safest, Always combines memory_order_acquire and memory_order_release.<\/td>\n<\/tr>\n<\/table>\n<hr>\n<h2>Showcase<\/h2>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;atomic&gt;\r\n#include &lt;thread&gt;\r\n#include &lt;iostream&gt;\r\n\r\nstd::atomic&lt;bool&gt; ready(false);\r\nint value = 0;\r\n\r\nvoid writer() {\r\n    value = 123;\r\n    ready.store(true, std::memory_order_relaxed);\r\n}\r\n\r\nvoid reader() {\r\n    while (!ready.load(std::memory_order_relaxed)) {}\r\n    std::cout &lt;&lt; value &lt;&lt; &quot;\\n&quot;; \/\/ might print 0\r\n}\r\n\r\nint main() {\r\n    std::thread t1(writer);\r\n    std::thread t2(reader);\r\n    t1.join();\r\n    t2.join();\r\n}\r\n<\/pre>\n<p>With memory_order_relaxed it&#8217;s not assured, that line 9 gets executed before line 10.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Overview Memory order Description memory_order_relaxed Unsafest, No ordering is guaranteed. memory_order_acquire A load operation, No reads or writes in the<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false},"categories":[63],"tags":[],"_links":{"self":[{"href":"http:\/\/www.max-sperling.bplaced.net\/index.php?rest_route=\/wp\/v2\/posts\/18936"}],"collection":[{"href":"http:\/\/www.max-sperling.bplaced.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.max-sperling.bplaced.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.max-sperling.bplaced.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.max-sperling.bplaced.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=18936"}],"version-history":[{"count":9,"href":"http:\/\/www.max-sperling.bplaced.net\/index.php?rest_route=\/wp\/v2\/posts\/18936\/revisions"}],"predecessor-version":[{"id":18986,"href":"http:\/\/www.max-sperling.bplaced.net\/index.php?rest_route=\/wp\/v2\/posts\/18936\/revisions\/18986"}],"wp:attachment":[{"href":"http:\/\/www.max-sperling.bplaced.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=18936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.max-sperling.bplaced.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=18936"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.max-sperling.bplaced.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=18936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}