<br><br><div class="gmail_quote">On Sat, Aug 15, 2009 at 3:55 AM, John A. De Goes <span dir="ltr">&lt;<a href="mailto:john@n-brain.net">john@n-brain.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Aug 14, 2009, at 8:21 PM, Sebastian Sylvan wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
But you can&#39;t! I can easily envisage a scenario where there&#39;s a link between two pieces of data in two different files, where it&#39;s okay if the data in file A is &quot;newer&quot; (in a versioning sense, not a timestamp sense) than the corresponding data in file B, but the opposite doesn&#39;t hold. So if you have another program writing that data it will write first to A, and then to B. The program reading this *must* then read the files in the correct order (B then A, to ensure the data from A is always newer or at the same &quot;version&quot; as the data in B).<br>

</blockquote>
<br></div>
That&#39;s nonsense. Because what happens if your program reads A while the other program is writing to A</blockquote><div><br></div><div>Depends on the file system. For example, the file could be locked so you would just block. Or the file system might be transactional. I used files as an example, the point wasn&#39;t to get bogged down in exact semantics of concurrent access - assume all reads/writes are atomic (or can be viewed as such from the apps POV) for the purposes of discussion.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">, or reads B just after the other program has written to A, but before it has written to B?</blockquote><div>
<br></div><div>This is precisely the scenario that would be legal in that case. You&#39;d end up with data from A that&#39;s newer than B, which we said was okay, but for some app-specific reason the opposite is *not* okay. In order for you not to crash you *have* to make sure you read from B first, because otherwise you could read from A right before it&#39;s updated, and then read B right after both A and B have been updated which means B is now newer than A and your program goes boom.</div>
<div><br></div><div> The point is that the ordering of reads are not arbitrary.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
As I said before, you cannot make any guarantees in the presence of interference, _with or without_ commuting.</blockquote><div><br></div><div>That&#39;s a separate issue. The problem is that if you *do* depend on outside &quot;interference&quot;, then the sequence of operations matters.</div>
<div><br></div><div> </div></div>-- <br>Sebastian Sylvan<br>