On Friday, 10 February 2017 at 23:57:18 UTC, bitwise wrote:
https://github.com/dlang/phobos/blob/cd7846eb96ea7d2fa65ccb04b4ca5d5b0d1d4a63/std/experimental/allocator/mallocator.d#L63-L65

Looking at Mallocator, the use of 'shared' doesn't seem correct to me.

The logic stated in the comment above is that 'malloc' is thread safe, and therefore all methods of Mallocator can be qualified with 'shared'.

I thought that qualifying a method as 'shared' meant that it _can_ touch shared memory, and is therefore _not_ thread safe.


The following program produces this error:
"Error: shared method Mallocator.allocate is not callable using a non-shared object"

import std.experimental.allocator.mallocator;

int main(string[] argv) {
    Mallocator m;
    m.allocate(64);
    return 0;
}

And the above error is because it would be un(thread)safe to call those methods from a non-shared context, due to the fact that they may access shared memory.

Am I wrong here?

A shared method means that it can only be called on a shared instance of the struct/class, which will have shared fields. A shared method should be logically thread-safe, but that cannot be guaranteed by the compiler. A non-shared method can touch shared memory, and thus should be thread-safe if it does, but can only be called on a non-shared instance with possibly non-shared fields.

shared/non-shared methods don't mix because you generally need to use different, less-efficient instructions and algorithms to be thread-safe and scalable in a shared method. In the case of Mallocator, there are no fields so as far as I can tell the attribute doesn't do much except for documentation and for storing references to it in other shared structs/objects.

Reply via email to