On Sunday, 21 October 2018 at 13:24:49 UTC, Stanislav Blinov
wrote:
On Sunday, 21 October 2018 at 11:25:16 UTC, aliak wrote:
When I say ok, I mean assuming the implementer actually wrote
correct code. This applies to any shared method today as well.
This ("ok") can only be achieved if the "implementor" (the
"expert") writes every function self-contained, at which point
sharing something from user code becomes a non-issue (i.e. it
becomes unnecessary). But that's not a very useful API. As soon
as you have more than one function operating on the same data,
the onus is on the user (the caller) to call those functions in
correct order, or, more generally, without invalidating the
state of shared data.
The onus is *always* on the user to write function calls in the
correct order, multi-threading or not. We expect programmers to
be able to figure out why this doesn't print 'Hello world!':
void main() {
import std.stdio;
string hello;
writeln(hello);
hello = "Hello world!";
}
We also expect writeln to be written in such a way that it
doesn't corrupt random data or cause life-threatening situations
just because hello was uninitialized upon calling writeln, and
assigned afterwards. We should expect the same of multi-threaded
programs.
This places the onus of writing thread-safe code on the writer of
the multi-threaded equivalent of writeln and string.opAssign.
Only this way can the user of the library write code and not
expect things to blow up in their face.
--
Simen