shared - i need it to be useful
Stanislav Blinov
stanislav.blinov at gmail.com
Sun Oct 21 21:04:00 UTC 2018
On Sunday, 21 October 2018 at 19:22:45 UTC, Manu wrote:
> On Sun, Oct 21, 2018 at 5:50 AM Stanislav Blinov via
> Digitalmars-d <digitalmars-d at puremagic.com> wrote:
>> Because the whole reason to have `shared` is to avoid the
>> extraneous checks that you mentioned above,
>
> No, it is to assure that you write correct not-broken code.
You can do that without `shared`.
>> and only write actual useful code (i.e. lock-write-unlock, or
>> read-put-to-queue-repeat, or whatever), not busy-work (testing
>> if the file is open on every call).
>
> `shared` is no comment on performance. You have written a slow
> locking API.
> If you care about perf, you would write a completely different
> API that favours perf.
> This not impossible, nor even particularly hard.
You're conflating your assumptions about the code with the topic
of this discussion. I can write a million examples and you'll
still find a million reasons to talk about how they're
incorrectly implemented, instead of focusing on merits or
disadvantages of your proposal with the code given as is.
>> If you have a `shared` reference, it better be to existing
>> data.
>
> I mean, if I dereference a pointer, it had better not be null!
Why would you share a null pointer?
>> That's why having `shared` and un-`shared`
>> references to the same data simultaneously is not safe: you
>> can't guarantee in any way that the owning thread doesn't
>> invalidate
>> the data through it's non-`shared` reference while you're doing
>> your threadsafe `shared` work; you can only "promise" that by
>> convention (documentation).
>
> The owning thread is not a special actor. Your reasoning is
> wonky here.
Why have it then at all? If it's not a "special" actor, just make
all shared data `shared`. But your proposal specifically targets
the conversion, suggesting you *do* need a special actor.
>> And I have partially-read or partially-written data.
>
> I expect you flushed before killing the file.
So? The threads still weren't done yet.
>> Or Maybe I call closeFile(), main thread continues and opens
>> another file,
>> which gives the same file descriptor, `shared` references to
>> FileHandle which the user forgot to wait on continue to work
>> oblivious to the fact that it's a different file now.
> It's wild to suggest that ANY design for `shared` should
> somehow deal with the OS recycling a file handle...
I'm not suggesting that at all, you've completely misrepresenting
what I'm saying by splitting a quote.
> And it's still not an un- at safe crash! It's just a program with
> a bug.
Ok, if you say that sticking @safe on code that can partially
piece together data from unrelated sources is fine, then sure.
>> > I'm going to assume that `shareWithThreads()` was implemented
>> > by an 'expert' who checked the function results for errors...
>> But you can only find out about these errors in
>> `waitForThreads`, the very call that the user "forgot" to make!
>
> ...what?
Please suggest another way of handling errors reported by other
threads. More `shared` state?
>> [ ... snip ... ]
>
> You have to concede defeat at this point.
I agree. No matter how hard I try or how many times I ask you to
demonstrate, I still fail to see the value in assuming @safe
implicitly conversion of mutable data to shared. Instead of
defending your proposal, you chose to attack the opposition.
You've defeated me, flawless victory.
> Destroy my proposal with another legitimately faulty program.
Is there a point? I post code, you: "nah, that's wrong". Steven
posts code, you: "nah, that's wrong". Timon posts code, you:
"nah, that's wrong". Walter posts code, you: "nah, that's
wrong"... What's right then?
More information about the Digitalmars-d
mailing list