On Wed, 07 Dec 2011 14:51:49 +0100, Steven Schveighoffer <schvei...@yahoo.com> wrote:

On Wed, 07 Dec 2011 04:00:34 -0500, Jonathan M Davis <jmdavisp...@gmx.com> wrote:

On Wednesday, December 07, 2011 09:10:16 Martin Nowak wrote:
On Wed, 07 Dec 2011 08:59:32 +0100, raojm <ra...@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
On a second thought that was wrong, D's AA do allocate one node per value,
so pointers to the values won't get invalidated. But simple optimizations
as adding a freelist would break this.
Depending on your application you should either lock access or
have a look at implementing a lock-free map.


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

Reply via email to