The select already received in that case and is waiting to send, but the 
select has to be re-entered for the next receive to happen.

Matt

On Wednesday, February 7, 2018 at 9:22:31 AM UTC-6, Damon Zhao wrote:
>
> I know wrap with a goroutine can fix it. I just wonder why must use an 
> extra goroutine?
>
> 在 2018年2月7日星期三 UTC+8下午11:00:25,matthe...@gmail.com写道:
>>
>> Desynchronizing "case idle <- <-source:" fixes it:
>>
>> case v := <-source:
>>     go func () { idle <- v }()
>>
>> I added a counter to break after a number of loops since it goes 
>> infinitely: https://play.golang.org/p/aZbmTKvpxcD
>>
>> Matt
>>
>> On Wednesday, February 7, 2018 at 8:38:41 AM UTC-6, Damon Zhao wrote:
>>>
>>> Please answer these questions before submitting your issue. Thanks!
>>> What version of Go are you using (go version)?
>>>
>>> go version go1.9.3 darwin/amd64
>>> Does this issue reproduce with the latest release?
>>>
>>> yes
>>> What operating system and processor architecture are you using (go env)?
>>> GOARCH="amd64"
>>> GOBIN=""
>>> GOEXE=""
>>> GOHOSTARCH="amd64"
>>> GOHOSTOS="darwin"
>>> GOOS="darwin"
>>> GOPATH="/Users/ariesdevil/Dropbox/workspace/go_workspace"
>>> GORACE=""
>>> GOROOT="/usr/local/Cellar/go/1.9.3/libexec"
>>> GOTOOLDIR="/usr/local/Cellar/go/1.9.3/libexec/pkg/tool/darwin_amd64"
>>> GCCGO="gccgo"
>>> CC="clang"
>>> GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics 
>>> -Qunused-arguments -fmessage-length=0 
>>> -fdebug-prefix-map=/var/folders/h2/xl15t9g94tgfwclshzl086bh0000gp/T/go-build125147941=/tmp/go-build
>>>  
>>> -gno-record-gcc-switches -fno-common"
>>> CXX="clang++"
>>> CGO_ENABLED="1"
>>> CGO_CFLAGS="-g -O2"
>>> CGO_CPPFLAGS=""
>>> CGO_CXXFLAGS="-g -O2"
>>> CGO_FFLAGS="-g -O2"
>>> CGO_LDFLAGS="-g -O2"
>>> PKG_CONFIG="pkg-config"
>>>
>>> What did you do?
>>>
>>> code1: play.golang.org/p/8rcO11QS8un (@ianlancetaylor answerd at 
>>> https://github.com/golang/go/issues/23728#issuecomment-363771924)
>>>
>>>
>>> code2: https://play.golang.org/p/fJXhK8w22uu
>>>
>>> Above code2 sometimes run perfect and sometimes deadlock on my machine.
>>>
>>>
>>> <https://lh3.googleusercontent.com/-j-2Sg_4wENk/WnsPXZktt7I/AAAAAAAAb9M/vI8Ci9g8k9gZ_83XWS6qgR2bxjuHN8w1ACLcBGAs/s1600/%25E5%25B1%258F%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-02-07%2B22.10.22.png>
>>>
>>>
>>>
>>> But if I put it in a goroutine, the result is confused:
>>>
>>>
>>> https://play.golang.org/p/oUmMr8TM2sz  success
>>>
>>> https://play.golang.org/p/54eLI7x5FwD failed
>>>
>>>
>>> notice line 25 when I use
>>>
>>> ```
>>>
>>> case worker := <-source:
>>>
>>>         idle <- worker
>>>
>>> ```
>>>
>>> instead of:
>>>
>>> ```
>>>
>>> case idle <- <-source:
>>>
>>> ```
>>>
>>> it works.
>>> What did you expect to see?
>>>
>>> I think it should not deadlock.
>>> What did you see instead?
>>> deadlock sometimes.
>>>
>>>
>>>

-- 
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