<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 26, 2015 at 11:40 AM, Marek Olšák <span dir="ltr"><<a href="mailto:maraeo@gmail.com" target="_blank">maraeo@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">If p_atomic_read is fine, then this patch is fine too. So you're<br>
telling that this should work:<br>
<br>
while (p_atomic_read(var));<br>
<br>
I wouldn't be concerned about a memory barrier. This is only 1 int, so<br>
it should make its way into the shared cache eventually.<br>
<span class="HOEnZb"><font color="#888888"><br></font></span></blockquote><div><br></div><div>Yes, it does make it to the shared cache, but the assumption is that the compiler will actually generate code to check the memory location more than one. I've personally been bitten by this assumption - it's a bad one. Ilia is right. If you have a variable that doesn't appear to modified at all, but you, the programmer know it will be modified by another thread, you're asking for an infinite loop. The only guarantee you get is that if this code ran in isolation on a single thread, it will do what you told it to. Consider even a trivial transformation:<br><br></div><div>while(1) {<br><br></div><div>    if(var == 0) break;<br></div><div><br>}<br></div><div><br></div><div>The compiler can optimize this to a single statement:<br><br></div><div>if(var != 0) infinite_loop();<br><br></div><div>...because it produces the same results as the above code when run in isolation. However, if 'var' is volilate, it cannot assume that the value will remain the same and cannot apply this "optimization". What's more fun is that debug mode tends to not apply these sorts of optimizations, so your code hangs in release builds, and when you check the memory location, you can see that it has been updated. Commence tearing hair out. Then you look at the assembly and hit your head on the desk. Or something like that. ;)<br><br></div><div>Patrick<br></div><div><br></div><div class="h5"><br></div></div></div></div>