<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On 2-feb-10, at 05:12, Fawzi Mohamed wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div><br>On 2-feb-10, at 04:59, Andrei Alexandrescu wrote:<br><br><blockquote type="cite">Fawzi Mohamed wrote:<br></blockquote><blockquote type="cite"><blockquote type="cite">On 2-feb-10, at 01:34, Andrei Alexandrescu wrote:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">Fawzi Mohamed wrote:<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">you don't need a barrier, you need a volatile statement to avoid compiler optimizations<br></blockquote></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">That depends on the platform. On contemporary Intel machines I agree there's no need for a barrier.<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">as I explained in another post (that I wrote several hours ago, but unfortunately was just sent (I closed the computer too fast...) I think that you don't really understand what barriers do.<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">It's possible I am not expressing myself clearly. My understanding is described at length in this article:<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><a href="http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf">http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf</a><br></blockquote><br>yes in that case you need a barrier because you expect that some other memory (the one that holds the singleton) is initialized *if* you are able to read the value of the pointer pointing to it.<br>Thus you need to introduce a partial ordering that guarantees that you will never see the pointer pointing to the memory before seeing the initialized memory.<br>You need a partial ordering in the memory write/reads.<br>This is not connected (in general, maybe on some hardware it is) to reading the updated value read from memory.<br>What breaks an access to a single atomic value is not the absence of a barrier, but putting it in a register and not bothering to load it each time (something that a compiler might to in some occasions as optimization).<br>I hope now the issue is clearer.<font class="Apple-style-span" color="#000000"><font class="Apple-style-span" color="#144FAE"><br></font></font></div></blockquote><br></div><div>by the way the article you linked is correct, and points to a real problem of naive double lock patterns, but not relevant in the current context, the details of concurrency are difficult, I also get confused at times :).</div><div><br></div><div>Fawzi</div></body></html>