<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;color:rgb(68,68,68)"><div class="gmail_default" style="font-size:12.8px">Hi,</div><div class="gmail_default" style="font-size:12.8px"><br></div><div class="gmail_default" style="font-size:12.8px">I will file a bug.</div><div class="gmail_default" style="font-size:12.8px"><br></div><div class="gmail_default" style="font-size:12.8px">I think that I should file one bug int the <a href="https://bugzilla.xamarin.com/buglist.cgi?component=BCL%20Class%20Libraries&list_id=218333&product=iOS&resolution=---" target="_blank">iOS BCL</a> libraries and one for the <a href="https://bugzilla.xamarin.com/buglist.cgi?component=BCL%20Class%20Libraries&list_id=218332&product=Android&resolution=---" target="_blank">Android BCL</a>, right? I guess the solution will be related to one another though.</div><div class="gmail_default" style="font-size:12.8px"><br></div><div class="gmail_default" style="font-size:12.8px">Best,</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 7, 2016 at 11:20 AM, Alex Rønne Petersen <span dir="ltr"><<a href="mailto:alex@alexrp.com" target="_blank">alex@alexrp.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
It is correct that the volatile keyword should result in<br>
acquire/release barriers as a result of compiling down to<br>
Thread.VolatileRead () / VolatileWrite () calls. In theory, the only<br>
difference between the Thread and Volatile methods is that the<br>
Volatile methods will actually be atomic for 64-bit quantities on a<br>
32-bit machine, where the Thread methods will not (incidentally, this<br>
is why the volatile keyword is not allowed on 64-bit types). But since<br>
you're using a 32-bit value, this shouldn't matter. So the fact that<br>
switching the code to the Volatile methods makes it work is very<br>
strange indeed.<br>
<br>
Could you file a bug with the test case you provided?<br>
<br>
Regards,<br>
Alex<br>
<div class="HOEnZb"><div class="h5"><br>
On Wed, Jul 6, 2016 at 5:13 PM, petrakeas <<a href="mailto:petrakeas@gmail.com">petrakeas@gmail.com</a>> wrote:<br>
> 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>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><span><font face="verdana, sans-serif"><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><font size="2" color="#666666">Petros Douvantzis</font></span></p><p style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><font size="2" color="#666666">Co-founder</font></span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><font size="2" color="#666666">Horizon Video Technologies</font></span></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="text-decoration:underline;vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><font size="2" color="#666666"><a href="http://horizon.camera" target="_blank">horizon.camera</a></font></span><br></p></font></span><br></div></div></div></div>
</div>