std.container.BinaryHeap + refCounted = WTF???
Steven Schveighoffer
schveiguy at yahoo.com
Wed Nov 17 07:29:39 PST 2010
On Wed, 17 Nov 2010 10:14:21 -0500, dsimcha <dsimcha at yahoo.com> wrote:
> == Quote from Steven Schveighoffer (schveiguy at yahoo.com)'s article
>> I think that we need a wrapper for containers that implements the shared
>> methods required and manually locks things in order to use them. Then
>> you
>> apply this wrapper to any container type, and it's now a shared
>> container.
>> There are also certain types of containers that lend themselves to
>> shared
>> access. For example, I can see a linked list where each node contains a
>> lock being a useful type.
>
> This is a good idea to some degree, but the thing is that it forces you
> to use
> shared even when you're going for fine-grained parallelism and want to
> just cowboy
> it. For fine-grained parallelism use cases, my hunch is that cowboying
> is going
> to be the only game in town for a long time in all languages, not just D.
There is always the possibility of "cowboy"ing it. But I don't see that
the standard lib should be catering to this.
>
>> > (For arrays, I'm referring to the appending issue, which is
>> problematic
>> > when I try
>> > to append to an array from multiple threads, synchronizing manually.)
>> I'm interested what you mean here, I tried to make sure cross-thread
>> appending is possible.
>> >> dcollections containers would probably all fail if you tried to use
>> them
>> >> from multiple threads.
>
> Ok, I stand corrected. It seemed to work in practice, but always I just
> assumed
> that it was a Bad Thing to do and worked for the Wrong Reasons.
There is specific code in array appending that locks a global lock when
appending to shared arrays. Appending to __gshared arrays from multiple
threads likely will not work in some cases though. I don't know how to
get around this, since the runtime is not made aware that the data is
shared.
>> memory (a relatively abundant resource).
>
> Apparently you've never tired working with multigigabyte datasets using a
> conservative garbage collector and 32-bit address space.
Is that supported by out-of-the-box containers? I would expect you need
to create a special data structure to deal with such things.
And no, I don't regularly work with such issues. But my point is,
reference counting the *container* which uses some sort of memory
allocation to implement its innards is not coupling a limited resource to
memory allocation/deallocation. In other words, I think it's better to
have the container be a non-reference counted type, even if you
reference-count the elements. I prefer class semantics to be quite
honest, where explicit initialization is required.
-Steve
More information about the Digitalmars-d
mailing list