Is D associative array thread safe, and will it relocate memory when add or delete a value?
Steven Schveighoffer
schveiguy at yahoo.com
Wed Dec 7 05:51:49 PST 2011
On Wed, 07 Dec 2011 04:00:34 -0500, Jonathan M Davis <jmdavisProg at gmx.com>
wrote:
> On Wednesday, December 07, 2011 09:10:16 Martin Nowak wrote:
>> On Wed, 07 Dec 2011 08:59:32 +0100, raojm <raojm at 91ne.com> wrote:
>> > Is D associative array thread safe, and will it relocate memory when
>> > add or delete a value?
>> >
>> > Where I can find the implemention.
>>
>> No it's not, and yes it has to relocate memory.
>> It's working as a hashtable not a binary tree, so all
>> pointers will be invalidated by adding/removing.
>> https://github.com/D-Programming-Language/druntime/blob/master/src/rt/aaA.d
>
> Yeah. AFAIK, it's impossible to have a hash table which doesn't risk
> reallocating something when adding a value to it, unless you limit how
> many
> elements it can hold or somesuch, which would make it considerably less
> useful. Typically, when a hash table gets full enough, it rehashes
> itself,
> which definitely involves allocating more memory, and possible
> reallocating a
> large portion of what it's already allocated. So, there's no way that an
> AA
> can avoid the risk of reallocating when elements are added to it, pretty
> much
> regardless of its implementation. It's an attribute of the data
> structure.
dcollections' HashMap does not invalidate cursors when adding data, even
when a rehash is done. The rehash routine specifically is written to make
this possible.
However, it does invalidate ranges.
Note that for any hash implementation, the only thing that needs to be
reallocated is the bucket array. In many implementations, this is not
where the data is stored.
-Steve
More information about the Digitalmars-d
mailing list