<div dir="ltr">I am implementing a custom Array type for a distributed memory system.<div><br><div>I have a DataView struct which represents the array to the user as a value type, and a backing store class object referenced by the DataView that does all the replication. Write accesses are mutating so they don&#39;t cause a problem.</div><div><br></div><div>However read only accesses are not mutating and there lies the problem. If the storage object is uniquely referenced, then I can do my business without taking a synchronization lock, otherwise I need to take a lock before syncing memory.</div><div><br></div><div>I can &quot;always&quot; take a lock to work around this, but most of the time it isn&#39;t necessary and I care about performance.</div><div><br></div><div>I think there should be a &quot;read only pass by reference&quot;</div><div><br></div><div>I just pulled this comment from the source code. I was under the impression that <span style="font-size:12.8px">isKnownUniquelyReferenced is thread safe, but the comments implies that it isn&#39;t??</span></div></div><div><br></div><div>------------------------------</div><div><div>/// If the instance passed as `object` is being accessed by multiple threads</div><div>/// simultaneously, this function may still return `true`. Therefore, you must</div><div>/// only call this function from mutating methods with appropriate thread</div><div>/// synchronization. That will ensure that `isKnownUniquelyReferenced(_:)`</div><div>/// only returns `true` when there is really one accessor, or when there is a</div><div>/// race condition, which is already undefined behavior.</div><div>///</div><div>/// - Parameter object: An instance of a class. This function does *not* modify</div><div>///   `object`; the use of `inout` is an implementation artifact.</div></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 25, 2017 at 10:31 AM, Joe Groff <span dir="ltr">&lt;<a href="mailto:jgroff@apple.com" target="_blank">jgroff@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
&gt; On Jan 25, 2017, at 10:20 AM, Edward Connell via swift-users &lt;<a href="mailto:swift-users@swift.org">swift-users@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; I have a data structure that calls isKnownUniquelyReferenced on a member. It forces everything to be marked as mutating because of the inout parameter, however the parameter is never mutated, it is just read right?? The reason it is inout is because a read only reference is required.<br>
&gt;<br>
&gt; If it is truly not mutating, is there some way around this so I don&#39;t have to mark everything in the caller chain as mutating also? It&#39;s kind of annoying...<br>
<br>
</span>In Swift&#39;s current model, `isKnownUniquelyReferenced` needs to be inout because that&#39;s currently the only way to assert unique access to an object in memory, since read-only rvalues are otherwise freely copyable so the result of the uniqueness check would be only momentarily valid at best. What are you trying to do that requires using it on a nonmutable value? There may be another way to go about it.<br>
<span class="HOEnZb"><font color="#888888"><br>
-Joe<br>
<br>
</font></span></blockquote></div><br></div>