{"id":19579,"date":"2022-11-07T03:51:45","date_gmt":"2022-11-06T22:21:45","guid":{"rendered":"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/"},"modified":"2022-11-07T03:51:45","modified_gmt":"2022-11-06T22:21:45","slug":"solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex","status":"publish","type":"post","link":"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/","title":{"rendered":"[Solved] What happens when reading or writing concurrently without a mutex"},"content":{"rendered":"<p> [ad_1]<br \/>\n<\/p>\n<div id=\"answer-61921852\" class=\"answer js-answer accepted-answer js-accepted-answer\" data-answerid=\"61921852\" data-parentid=\"61914041\" data-score=\"5\" data-position-on-page=\"1\" data-highest-scored=\"1\" data-question-has-accepted-highest-score=\"1\" itemprop=\"acceptedAnswer\" itemscope itemtype=\"https:\/\/schema.org\/Answer\">\n<div class=\"post-layout\">\n<div class=\"votecell post-layout--left\"><\/div>\n<div class=\"answercell post-layout--right\">\n<div class=\"s-prose js-post-body\" itemprop=\"text\">\n<blockquote>\n<p>However, in some cases I am just interested in the latest value of a variable or field of an object.<\/p>\n<\/blockquote>\n<p>Here is the fundamental problem: What does the word &#8220;latest&#8221; mean?<\/p>\n<p>Suppoose that, mathematically speaking, we have a sequence of values <em>X<sub>i<\/sub><\/em>, with <em>0 &lt;= i &lt; N<\/em>.  Then obviously <em>X<sub>j<\/sub><\/em> is &#8220;later than&#8221; <em>X<sub>i<\/sub><\/em> if <em>j &gt; i<\/em>.  That&#8217;s a nice simple definition of &#8220;latest&#8221; and is probably the one you want.<\/p>\n<p>But when two separate CPUs within a single machine\u2014including two goroutines in a Go program\u2014are working <em>at the same time<\/em>, <strong>time itself loses meaning<\/strong>.  We cannot say whether i &lt; j, i == j, or i &gt; j.  So there is no correct definition for the word <em>latest<\/em>.<\/p>\n<p>To solve this kind of problem, modern CPU hardware, and Go as a programming language, gives us certain <em>synchronization primitives<\/em>.  If CPUs A and B execute memory fence instructions, or synchronization instructions, or use whatever other hardware provisions exist, the CPUs (and\/or some external hardware) will insert whatever is required for the notion of &#8220;time&#8221; to regain its meaning.  That is, if the CPU uses barrier instructions, we can say that a memory load or store that was executed <em>before<\/em> the barrier is a &#8220;before&#8221; and a memory load or store that is executed <em>after<\/em> the barrier is an &#8220;after&#8221;.<\/p>\n<p>(The actual implementation, in some modern hardware, consists of load and store buffers that can rearrange the order in which loads and stores go to memory.  The barrier instruction either synchronizes the buffers, or places an actual barrier in them, so that loads and stores cannot move across the barrier.  This particular concrete implementation gives an easy way to think about the problem, but isn&#8217;t complete: you should think of time as simply <em>not existing<\/em> outside the hardware-provided synchronization, i.e., <em>all<\/em> loads from, and stores to, some location are happening simultaneously, rather than in some sequential order, except for these barriers.)<\/p>\n<p>In any case, Go&#8217;s <code>sync<\/code> package gives you a simple high level access method to these kinds of barriers.  Compiled code that executes before a mutex <code>Lock<\/code> call really does complete <em>before<\/em> the lock function returns, and the code that executes after the call really does not start until <em>after<\/em> the lock function returns.<\/p>\n<p>Go&#8217;s channels provide the same kinds of before\/after time guarantees.<\/p>\n<p>Go&#8217;s <code>sync\/atomic<\/code> package provides much lower level guarantees.  In general you should avoid this in favor of the higher level channel or <code>sync.Mutex<\/code> style guarantees.  (Edit to add note: You <em>could<\/em> use <code>sync\/atomic<\/code>&#8216;s <code>Pointer<\/code> operations here, but not with the <code>string<\/code> type directly, as Go strings are actually implemented as a header containing two separate values: a pointer, and a length.  You could solve this with another layer of indirection, by updating a pointer that points to the <code>string<\/code> object.  But before you even consider doing that, you should benchmark the use of the language&#8217;s preferred methods and verify that these are a problem, because code that works at the <code>sync\/atomic<\/code> level is hard to write and hard to debug.)<\/p>\n<\/p><\/div>\n<div class=\"mt24\"><\/div>\n<\/div>\n<p>            <span class=\"d-none\" itemprop=\"commentCount\">10<\/span> <\/p><\/div>\n<\/div>\n<p>[ad_2]<\/p>\n<p>solved What happens when reading or writing concurrently without a mutex <\/p>\n","protected":false},"excerpt":{"rendered":"<p>[ad_1] However, in some cases I am just interested in the latest value of a variable or field of an object. Here is the fundamental problem: What does the word &#8220;latest&#8221; mean? Suppoose that, mathematically speaking, we have a sequence of values Xi, with 0 &lt;= i &lt; N. Then obviously Xj is &#8220;later than&#8221; &#8230; <a title=\"[Solved] What happens when reading or writing concurrently without a mutex\" class=\"read-more\" href=\"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/\" aria-label=\"More on [Solved] What happens when reading or writing concurrently without a mutex\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[320],"tags":[4646,929,596,4645,4414],"class_list":["post-19579","post","type-post","status-publish","format-standard","hentry","category-solved","tag-atomic","tag-concurrency","tag-go","tag-mutex","tag-shared-memory"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>[Solved] What happens when reading or writing concurrently without a mutex - JassWeb<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[Solved] What happens when reading or writing concurrently without a mutex - JassWeb\" \/>\n<meta property=\"og:description\" content=\"[ad_1] However, in some cases I am just interested in the latest value of a variable or field of an object. Here is the fundamental problem: What does the word &#8220;latest&#8221; mean? Suppoose that, mathematically speaking, we have a sequence of values Xi, with 0 &lt;= i &lt; N. Then obviously Xj is &#8220;later than&#8221; ... Read more\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/\" \/>\n<meta property=\"og:site_name\" content=\"JassWeb\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-06T22:21:45+00:00\" \/>\n<meta name=\"author\" content=\"Kirat\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kirat\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/\"},\"author\":{\"name\":\"Kirat\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31\"},\"headline\":\"[Solved] What happens when reading or writing concurrently without a mutex\",\"datePublished\":\"2022-11-06T22:21:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/\"},\"wordCount\":531,\"publisher\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\"},\"keywords\":[\"atomic\",\"concurrency\",\"go\",\"mutex\",\"shared-memory\"],\"articleSection\":[\"Solved\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/\",\"url\":\"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/\",\"name\":\"[Solved] What happens when reading or writing concurrently without a mutex - JassWeb\",\"isPartOf\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#website\"},\"datePublished\":\"2022-11-06T22:21:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/jassweb.com\/solved\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[Solved] What happens when reading or writing concurrently without a mutex\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/jassweb.com\/solved\/#website\",\"url\":\"https:\/\/jassweb.com\/solved\/\",\"name\":\"JassWeb\",\"description\":\"Build High-quality Websites\",\"publisher\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/jassweb.com\/solved\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\",\"name\":\"Jass Web\",\"url\":\"https:\/\/jassweb.com\/solved\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png\",\"contentUrl\":\"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png\",\"width\":693,\"height\":132,\"caption\":\"Jass Web\"},\"image\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31\",\"name\":\"Kirat\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775798750\",\"contentUrl\":\"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775798750\",\"caption\":\"Kirat\"},\"sameAs\":[\"http:\/\/jassweb.com\"],\"url\":\"https:\/\/jassweb.com\/solved\/author\/jaspritsinghghumangmail-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[Solved] What happens when reading or writing concurrently without a mutex - JassWeb","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/","og_locale":"en_US","og_type":"article","og_title":"[Solved] What happens when reading or writing concurrently without a mutex - JassWeb","og_description":"[ad_1] However, in some cases I am just interested in the latest value of a variable or field of an object. Here is the fundamental problem: What does the word &#8220;latest&#8221; mean? Suppoose that, mathematically speaking, we have a sequence of values Xi, with 0 &lt;= i &lt; N. Then obviously Xj is &#8220;later than&#8221; ... Read more","og_url":"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/","og_site_name":"JassWeb","article_published_time":"2022-11-06T22:21:45+00:00","author":"Kirat","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Kirat","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/#article","isPartOf":{"@id":"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/"},"author":{"name":"Kirat","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31"},"headline":"[Solved] What happens when reading or writing concurrently without a mutex","datePublished":"2022-11-06T22:21:45+00:00","mainEntityOfPage":{"@id":"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/"},"wordCount":531,"publisher":{"@id":"https:\/\/jassweb.com\/solved\/#organization"},"keywords":["atomic","concurrency","go","mutex","shared-memory"],"articleSection":["Solved"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/","url":"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/","name":"[Solved] What happens when reading or writing concurrently without a mutex - JassWeb","isPartOf":{"@id":"https:\/\/jassweb.com\/solved\/#website"},"datePublished":"2022-11-06T22:21:45+00:00","breadcrumb":{"@id":"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/jassweb.com\/solved\/solved-what-happens-when-reading-or-writing-concurrently-without-a-mutex\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/jassweb.com\/solved\/"},{"@type":"ListItem","position":2,"name":"[Solved] What happens when reading or writing concurrently without a mutex"}]},{"@type":"WebSite","@id":"https:\/\/jassweb.com\/solved\/#website","url":"https:\/\/jassweb.com\/solved\/","name":"JassWeb","description":"Build High-quality Websites","publisher":{"@id":"https:\/\/jassweb.com\/solved\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jassweb.com\/solved\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/jassweb.com\/solved\/#organization","name":"Jass Web","url":"https:\/\/jassweb.com\/solved\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/","url":"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png","contentUrl":"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png","width":693,"height":132,"caption":"Jass Web"},"image":{"@id":"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31","name":"Kirat","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/image\/","url":"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775798750","contentUrl":"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775798750","caption":"Kirat"},"sameAs":["http:\/\/jassweb.com"],"url":"https:\/\/jassweb.com\/solved\/author\/jaspritsinghghumangmail-com\/"}]}},"_links":{"self":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts\/19579","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/comments?post=19579"}],"version-history":[{"count":0,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts\/19579\/revisions"}],"wp:attachment":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/media?parent=19579"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/categories?post=19579"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/tags?post=19579"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}