<div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span style="font-family:arial,sans-serif;font-size:13px">My guess the reason its not explicitly documented is that its only for </span><span style="font-family:arial,sans-serif;font-size:13px">types reference or smaller.</span></blockquote>
<div style><span style="font-family:arial,sans-serif;font-size:13px">In this case it sounds like an unintentional implementation detail that shouldn't be relied on?</span></div><div style><span style="font-family:arial,sans-serif;font-size:13px"><br>
</span></div><div style><span style="font-family:arial,sans-serif;font-size:13px">You could probably look at the SSCLI and see if there's any comments around it (but I think that if you look at that code, you will be unable to contribute to Mono).</span></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Feb 4, 2013 at 9:46 PM, Greg Young <span dir="ltr"><<a href="mailto:gregoryyoung1@gmail.com" target="_blank">gregoryyoung1@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The .NET version does support it for types or reference size or smaller.<br>
<br>
My guess the reason its not explicitly documented is that its only for<br>
types reference or smaller.<br>
<div class="HOEnZb"><div class="h5"><br>
On Mon, Feb 4, 2013 at 12:40 PM, Alan <<a href="mailto:alan.mcgovern@gmail.com">alan.mcgovern@gmail.com</a>> wrote:<br>
> Hey,<br>
><br>
> As per the 'thread safety' section of the documentation, your code is<br>
> invalid: <a href="http://msdn.microsoft.com/en-us/library/xfhwa508.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/xfhwa508.aspx</a>. This<br>
> kind of change will not make it safe to use the dictionary in a<br>
> read/write way from multiple threads, especially not when you have<br>
> multiple cores and multiple unshared caches for those CPU cores.<br>
><br>
> Hashtable is documented to support multiple readers with at most 1<br>
> writer. If you require those semantics, you should use a hashtable not<br>
> a Dictionary. If you require a threadsafe dictionary class, you either<br>
> need to roll your own or use ConcurrentDictionary. This is the only<br>
> realistic way of having thread safe code.<br>
><br>
> Alan<br>
><br>
><br>
> On 4 February 2013 10:18, Rafael Teixeira <<a href="mailto:monoman@gmail.com">monoman@gmail.com</a>> wrote:<br>
>> Yes, please.<br>
>><br>
>> Rafael "Monoman" Teixeira<br>
>> ---------------------------------------<br>
>> "The most exciting phrase to hear in science, the one that heralds new<br>
>> discoveries, is not 'Eureka!' (I found it!) but 'That's funny ...'"<br>
>> Isaac Asimov<br>
>> US science fiction novelist & scholar (1920 - 1992)<br>
>><br>
>><br>
>> On Sun, Feb 3, 2013 at 5:15 PM, Greg Young <<a href="mailto:gregoryyoung1@gmail.com">gregoryyoung1@gmail.com</a>> wrote:<br>
>>><br>
>>> The .NET dictionary implementation is thread safe on reads/updates so<br>
>>> long as the internal collection does not grow and size is of reference<br>
>>> type or smaller. eg: if you set size to 1m items and had 100k with a<br>
>>> fill factor that did not cause an internal growth it would be<br>
>>> threadsafe. This assurance has been brought over from Hashtable (well<br>
>>> documented) and is relatively not well documented but many take a<br>
>>> dependency on it. The current mono implementation does not meet this<br>
>>> assurance.<br>
>>><br>
>>>                         int cur = table [(hashCode & int.MaxValue) %<br>
>>> table.Length] - 1;<br>
>>><br>
>>>                         // walk linked list until right slot is found or<br>
>>> end is reached<br>
>>>                         while (cur != NO_SLOT) {<br>
>>>                                 // The ordering is important for<br>
>>> compatibility with MS and strange<br>
>>>                                 // Object.Equals () implementations<br>
>>>                                 if (linkSlots [cur].HashCode == hashCode<br>
>>> && hcp.Equals (keySlots<br>
>>> [cur], key)) {<br>
>>>                                         value = valueSlots [cur];<br>
>>>                                         return true;<br>
>>>                                 }<br>
>>>                                 cur = linkSlots [cur].Next;<br>
>>>                         }<br>
>>><br>
>>> seems fine when accessing. However when adding...<br>
>>><br>
>>>                         // find an empty slot<br>
>>>                         cur = emptySlot;<br>
>>>                         if (cur == NO_SLOT)<br>
>>>                                 cur = touchedSlots++;<br>
>>>                         else<br>
>>>                                 emptySlot = linkSlots [cur].Next;<br>
>>><br>
>>>                         // store the hash code of the added item,<br>
>>>                         // prepend the added item to its linked list,<br>
>>>                         // update the hash table<br>
>>>                         linkSlots [cur].HashCode = hashCode;<br>
>>>                         linkSlots [cur].Next = table [index] - 1;<br>
>>>                         table [index] = cur + 1;<br>
>>><br>
>>>                         // store item's data<br>
>>>                         keySlots [cur] = key;<br>
>>>                         valueSlots [cur] = value;<br>
>>><br>
>>> Can cause null reads of a key as its in linkSlots but the value slot<br>
>>> has not yet been updated. Setting keySlots after valueSlots would seem<br>
>>> to solve this. Pull request wanted?<br>
>>><br>
>>> Cheers,<br>
>>><br>
>>> Greg<br>
>>><br>
>>> --<br>
>>> Le doute n'est pas une condition agréable, mais la certitude est absurde.<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" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
>><br>
>><br>
>><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" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
>><br>
<br>
<br>
<br>
--<br>
Le doute n'est pas une condition agréable, mais la certitude est absurde.<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" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
</div></div></blockquote></div><br></div>