Your first program has a data race, well it has two races, the first is a
data race between the goroutines writing to the slice and the println which
will read the contents of the slice. That is, if those writing goroutines
get a chance to run before main exits.

The second program doesn't have a data race as the waitgroup.done / wait
creates a happens before relationship between reader and writer.

On Thu, 3 Aug 2017, 17:33 Henrik Johansson <dahankz...@gmail.com> wrote:

> But isn't this what is happening in the example? Or is write-only not
> sharing?
>
> On Thu, 3 Aug 2017, 09:23 Dave Cheney, <d...@cheney.net> wrote:
>
>> IMO you need a lock whenever you are sharing a value between goroutines
>> by storing it in memory.
>>
>> On Thu, 3 Aug 2017, 17:21 Henrik Johansson <dahankz...@gmail.com> wrote:
>>
>>> I think I am mostly after a mental pattern to easily recognise when
>>> synchronizations are needed.
>>>
>>> I am decently good at this but I tend to be very conservative and use
>>> locks and atomics perhaps when they are not needed.
>>> But here we have several goroutines all taking part in the
>>> initialisation itself concurrently writing to the same array. How can this
>>> be safe in light of https://golang.org/ref/mem#tmp_10 . I get that your
>>> comment about "happens before" comes in here if there were any readers but
>>> eventually there will be readers or we would never need to do this. If the
>>> main after some time wants to access these values is it enough to make sure
>>> the goroutines are done perhaps using a WaitGroup or do we have to use some
>>> other synchronisation to ensure the visibility of the data in the array?
>>>
>>>  https://play.golang.org/p/8BfrPhyIEb
>>>
>>> Or is it needed to do something like this:
>>>
>>> https://play.golang.org/p/9QgTP5Dqc7
>>>
>>> I mean aside from the poor form of sleeping like this, the idea is to
>>> simulate usage "at some point later in time".
>>>
>>> It gets hypothetical pretty quick and usually when this happens I make
>>> sure to create a new array/slice/whatever and then atomically swap it
>>> before some other goroutine uses it but I generally avoid indexing
>>> assignment from go routines like this even though it seems to be ok.
>>>
>>> Does this hold for slices as well as for arrays? What about assignments
>>> to fields in structs? Can several goroutines safely write to different
>>> fields in the same struct assuming they are word sized? Does this hold for
>>> all architectures?
>>>
>>> I am sorry if I am still a bit unclear but I find it hard to ask
>>> properly when I am a bit unsure of the topic. :D
>>>
>>>
>>>
>>> tors 3 aug. 2017 kl 07:49 skrev Dave Cheney <d...@cheney.net>:
>>>
>>>> I'm not really sure what you are asking. I think your second paragraph
>>>> got eaten by autocorrect at the critical point. Could try maybe asking your
>>>> question in a different way?
>>>
>>>
>>>>
>>>> --
>>>> 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.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to