Shared
Radu
void at null.pt
Tue May 14 14:32:45 UTC 2019
On Monday, 13 May 2019 at 16:20:30 UTC, Jonathan M Davis wrote:
> On Monday, May 13, 2019 9:52:02 AM MDT Dominikus Dittes Scherkl
> via Digitalmars-d wrote:
>> [...]
>
> Actually, it doesn't. All you've done is lock a mutex and cast
> away shared. There is no guarantee that that mutex is always
> used when that object is accessed. There could easily be
> another piece of code somewhere that casts away shared without
> locking anything at the same time. And even if this were the
> only mechanism for removing shared, you could easily use it
> with the same object and a completely different mutex in
> another piece of code, thereby making the mutex useless. The
> type system has no concept of ownership and no concept of a
> mutex being associated with any particular object aside from
> synchronized classes (and those don't even currently require
> that the mutex always be used). And even if the compiler could
> check that all uses of a particular variable were locked with a
> mutex, that still wouldn't be enough, because other references
> to the same data could exist. So, with the construct you've
> proposed, there's no way for the compiler to guarantee that no
> other thread is accessing the data at the same time. All it
> guarantees is that a mutex has been locked, not that it's
> actually protecting the data.
>
> [...]
I had this idea for some time, not sure I can best articulated
now, but I think a workable solution for shared is closely linked
with the dip1000 - scoped pointers.
What I mean is that something like:
void doSharedStuff(scope shared(Foo) foo)
{
}
Will be able to safely lock/unlock foo and cast away shared'ness
in the function's scope.
The compiler can provide guarantees here that foo will not escape.
More information about the Digitalmars-d
mailing list