> > I'm not saying that m["foo"] is a > variable (it's not, because it's not addressable). I'm saying that m > is a variable and m["foo"] is a read of that variable m, just as if p > is a variable of pointer type then *p is a read of that variable p. >
Ah, ok, this framing makes sense to me! On Mon, Apr 13, 2020 at 1:59 PM Ian Lance Taylor <i...@golang.org> wrote: > On Mon, Apr 13, 2020 at 10:17 AM <alecben...@gmail.com> wrote: > > > > Very old thread I know, but: > > > > > a map is a variable > > > > This seems clear enough, but what doesn't seem obvious to me is that an > expression like m["foo"] can be treated as "just a variable". Does the spec > also make that clear? > > > > E.g., if I roll my own map type, there's no reason to assume > m.Get("foo") is safe for concurrent reads. Naively, I'd assume m["foo"] is > analogous to something like m.Get("foo"). Does the spec make it clear that > that's not the case, as far as memory semantics go? > > My opinion from more than six years ago is unchanged. > > A map m is a variable. An expression like m["foo"] is a read of that > variable. A statement like m["foo"] = "bar" is a write of that > variable. Yes, m["foo"] is safe for concurrent reads. I don't see > any way to insert a distinction between m and m["foo"] with regard to > whether a map is a variable. I'm not saying that m["foo"] is a > variable (it's not, because it's not addressable). I'm saying that m > is a variable and m["foo"] is a read of that variable m, just as if p > is a variable of pointer type then *p is a read of that variable p. > > I agree that if you roll your own map type then m.Get("foo") might not > necessarily be safe for concurrent calls, but I'm asserting that since > in Go a map is variable, m["foo"] must be safe for concurrent > execution. (And, for what it's worth, in the current implementations > that is true.) > > Ian > > > On Friday, November 15, 2013 at 1:12:53 PM UTC-5, Ian Lance Taylor wrote: > >> > >> On Thu, Nov 14, 2013 at 9:58 PM, Dominik Honnef <domi...@fork-bomb.org> > wrote: > >> > Ian Lance Taylor <ia...@golang.org> writes: > >> > > >> >>> It's not specified. > >> >> > >> >> A read from a map is like any other read from a variable. Thus it's > >> >> fine if multiple goroutines read from a map simultaneously. But if > >> >> one goroutine reads from a map while another writes to a map, or if > >> >> two goroutines write to a map, then the program must synchronize > those > >> >> goroutines in some way. > >> > > >> > Does the existing specification actually guarantee this? Because there > >> > are certainly ways to implement it that don't have that guarantee. > >> > https://code.google.com/p/go/source/detail?r=af469280a34b comes to > mind > >> > in particular. > >> > > >> > I know that this implementation of Go seems to guarantee it, but could > >> > there be an alternate implementation that implements maps that aren't > >> > safe for concurrent reads and still implement the specification? > >> > >> The relevant document is here is the memory model > >> (http://golang.org/ref/mem). The memory model is written in terms of > >> reads and writes to a variable. You are essentially saying "a map is > >> not a variable, so we need a separate specification for the behaviour > >> of a map." I am simply saying: a map is a variable. > >> > >> I'm not opposed to adding a sentence about maps to the memory model. > >> I'm just not sure it's required. > >> > >> You are of course correct that maps can be implemented such that they > >> do not meet the requirements of the Go memory model. It's possible to > >> implement non-map variables that way too, e.g., by caching reads and > >> writes across synchronization boundaries. Either way it would be a > >> case where the implementation fails to meet the spec, or, in other > >> words, it would be a bug. > >> > >> Ian > > > > -- > > You received this message because you are subscribed to the Google > Groups "golang-nuts" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to golang-nuts+unsubscr...@googlegroups.com. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/75e5430c-855e-479b-b1fa-d8ea196db3b9%40googlegroups.com > . > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CA%2Bz56Y6-tGdTaOs7yJihvQbU0%3D0H_K21E%2BnZYbHYF6ovw%3Db02Q%40mail.gmail.com.