shared - i need it to be useful
Stanislav Blinov
stanislav.blinov at gmail.com
Fri Oct 19 01:01:15 UTC 2018
On Friday, 19 October 2018 at 00:29:01 UTC, Timon Gehr wrote:
> On 18.10.18 23:34, Erik van Velzen wrote:
>> If you have an object which can be used in both a thread-safe
>> and a thread-unsafe way that's a bug or code smell.
>
> Then why do you not just make all members shared? Because with
> Manu's proposal, as soon as you have a shared method, all
> members effectively become shared. It just seems pointless to
> type them as unshared anyway and then rely on convention within
> @safe code to prevent unsafe accesses. Because, why? It just
> makes no sense.
Let's assume you have something like this:
module foo;
private shared int sharedState;
struct Accessor {
int flags;
void addUser(this T)() {
static if (is(T == shared))
sharedState.atomicInc(); // unconditionally increment
when it's a shared reference
else {
// owner may optimize shared access based on it's own
state
if (!(flags & SKIP_LOCKS)) sharedState.atomicInc();
}
}
void removeUser(this T)() {
static if (is(T == shared))
sharedState.atomicDec();
else {
if (!(flags & SKIP_LOCKS)) sharedState.atomicDec();
}
}
void setFlags(int f) { flags = f; }
}
The 'Accessor' doesn't really hold any shared state, but it
accesses a shared module global. Now, the *owner* (e.g. code that
instantiated a local Accessor) may use non-`shared` interface to
track additional state and make decisions whether or not access
the global. A concrete example would be e.g. an I/O lock, where
if you know you don't have any threads other than main, you can
skip syscalls locking/unlocking the handle.
> With the proposal I posted in the beginning, you would then not
> only get implicit conversion of class references to shared, but
> also back to unshared.
Is it in your first posts in this thread? I must've skipped that.
> I think the conflation of shared member functions and thread
> safe member functions is confusing. shared on a member function
> just means that the `this` reference is shared.
Nod.
> The only use case for this is overloading on shared. The D
> approach to multithreading is that /all/ functions should be
> thread safe, but it is easier for some of them because they
> don't even need to access any shared state. It is therefore
> helpful if the type system cleanly separates shared from
> unshared state.
Nod nod.
More information about the Digitalmars-d
mailing list