<div dir="ltr">Yes, it looks like a bug.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 6, 2016 at 11:13 AM, petrakeas <span dir="ltr"><<a href="mailto:petrakeas@gmail.com" target="_blank">petrakeas@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">According to C#  specification<br>
<<a href="https://msdn.microsoft.com/en-us/library/ms228593.aspx" rel="noreferrer" target="_blank">https://msdn.microsoft.com/en-us/library/ms228593.aspx</a>>  :<br>
<br>
•       A read of a volatile field is called a volatile read. A volatile read has<br>
“acquire semantics”; that is, it is guaranteed to occur prior to any<br>
references to memory that occur after it in the instruction sequence.<br>
•       A write of a volatile field is called a volatile write. A volatile write<br>
has “release semantics”; that is, it is guaranteed to happen after any<br>
memory references prior to the write instruction in the instruction<br>
sequence.<br>
<br>
The spec presents  an example<br>
<<a href="https://msdn.microsoft.com/en-us/library/aa645755(v=vs.71).aspx" rel="noreferrer" target="_blank">https://msdn.microsoft.com/en-us/library/aa645755(v=vs.71).aspx</a>>   where<br>
one thread writes "data" on a non volatile variable and "publishes" the<br>
result by writing on a volatile variable that acts as a flag. The other<br>
thread checks the volatile flag and if set, it accesses the non-volatile<br>
variable that is now *guaranteed* to contain the data.<br>
<br>
It seems that Mono 4.4 (the one used in Xamarin) does not enforce these<br>
semantics or in other words does not prevent memory re-ordering in Android<br>
and iOS that have relaxed memory models due to their CPU.<br>
<br>
I have created an a test that reproduces the problem in iOS and Android<br>
Program.cs <<a href="http://mono.1490590.n4.nabble.com/file/n4668111/Program.cs" rel="noreferrer" target="_blank">http://mono.1490590.n4.nabble.com/file/n4668111/Program.cs</a>>  .<br>
<br>
If the access to the volatile field is replaced by Volatile.Read() and<br>
Volatile.Write(), then no-problems occur. It seems that Volatile.Read() and<br>
Volatile.Write() implement half fences in Mono, but the volatile keyword<br>
does not.<br>
<br>
Is this a bug?<br>
<br>
<br>
<br>
<br>
--<br>
View this message in context: <a href="http://mono.1490590.n4.nabble.com/Volatile-fields-don-t-enforce-acquire-release-semantics-like-Volatile-Read-and-Volatile-Write-tp4668111.html" rel="noreferrer" target="_blank">http://mono.1490590.n4.nabble.com/Volatile-fields-don-t-enforce-acquire-release-semantics-like-Volatile-Read-and-Volatile-Write-tp4668111.html</a><br>
Sent from the Mono - Dev mailing list archive at Nabble.com.<br>
_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" rel="noreferrer" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
</blockquote></div><br></div>