[Mono-dev] Dictionary implementation + concurrency

Greg Young gregoryyoung1 at gmail.com
Mon Feb 4 11:07:59 UTC 2013


from reading it appears there is actually a possible race condition
with 1/n in the .net impl as well so nm

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



-- 
Le doute n'est pas une condition agréable, mais la certitude est absurde.


More information about the Mono-devel-list mailing list