You should use a wait group to guarantee the behaviour of this.

On Sat, 7 Apr 2018 at 12:54, T L <tapir....@gmail.com> wrote:

>
>
> On Monday, March 26, 2018 at 4:09:24 PM UTC-4, Marvin Renich wrote:
>>
>> It seems that you understand why you are seeing the behavior you
>> reported, but you are questioning whether the spec either does or should
>> guarantee that reading from a channel with a goroutine waiting to send
>> on that channel will fill the buffer as an atomic part of the read.
>>
>> As others have said, the spec does not guarantee this.  I would like to
>> add that I believe it shouldn't.  Suppose goroutine A is currently
>> blocked waiting to send on a channel.  Now goroutine B reads from that
>> channel.  If the refill of the channel must happen atomically with the
>> read from that channel, now goroutine B must be put in a blocked state
>> waiting for goroutine A to finish its send.  This contradicts the spec
>> at [1] which states
>>
>>   ...communication succeeds without blocking if the buffer is not full
>>   (sends) or not empty (receives).
>>
>> If you think about how this is likely to be implemented (including
>> considerations for GOMAXPROC and multicore vs single core systems), you
>> should realize that, while it would be possible to implement
>> atomic-refill, it would give no (or very little) benefit and might have
>> undesirable performance effects.
>>
>> As an aside, I think the reason Jake is seeing 100 lines of output and
>> you only see 1 is likely to be the difference between GOMAXPROC=1 and
>> greater than 1.  If GOMAXPROC=1, the scheduler may force a running
>> goroutine to yield after receiving, but before returning from the
>> receive operation.  In other words, the receive happens without
>> blocking, but the scheduler thinks that is a convenient point for giving
>> another goroutine an opportunity to run.
>>
>
>
> No, I tried both GOMAXPROC=1 and GOMAXPROC=4. Same results.
>
> It is strange that I just tried it again, now there will be always 100
> lines outputted,
> for both GOMAXPROC=1 and GOMAXPROC=4, for both v1.10 and v1.10.1.
> Quite strange.
>
>
>>
>> ...Marvin
>>
>> [1] https://golang.org/ref/spec#Channel_types
>
>
>
>
> --
> 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