“If lo” means that if the lo channel was read. This code will prevent a lo from being processed if a hi is available at the happens before moment of a value being ready.
That moment is somewhat arbitrary so it is only mildly different than Select hi: Default: Select hi Select lo Btw using indents rather than brackets in the above - maybe that is causing the confusion. > On May 6, 2021, at 12:37 PM, 'Axel Wagner' via golang-nuts > <golang-nuts@googlegroups.com> wrote: > > > No, it is not. Your "if lo" branch implies that the communication happened - > e.g. the sender was already unblocked. A `select` would not unblock the other > side unless that's the actual branch taken. > >> On Thu, May 6, 2021 at 7:32 PM Robert Engels <reng...@ix.netcom.com> wrote: >> I already showed you - just change it to >> >> Select hi >> Default: >> Select hi,lo >> If lo: >> Select hi >> Default : >> Pass >> >> And enqueue the lo if a hi and lo are read. >> >> That is all that is needed. >> >> >> >>>> On May 6, 2021, at 10:28 AM, 'Axel Wagner' via golang-nuts >>>> <golang-nuts@googlegroups.com> wrote: >>>> >>> >>> >>> >>>> On Thu, May 6, 2021 at 4:43 PM roger peppe <rogpe...@gmail.com> wrote: >>>>> >>>>>> On Thu, 6 May 2021 at 14:41, 'Axel Wagner' via golang-nuts >>>>>> <golang-nuts@googlegroups.com> wrote: >>>>>> PS: And I'm not saying there is no argument. Maybe "select is not >>>>>> atomic" is such an argument. But if there is an argument and/or if this >>>>>> is that argument, I don't fully understand it myself. >>>>> >>>>> One reason is that the semantics can conflict. Consider this code, for >>>>> example (assuming a hypothetical "pri select" statement that chooses the >>>>> first ready arm of the select) - the priorities conflict. I suspect Occam >>>>> doesn't encounter that issue because it only allows (or at least, it did >>>>> back when I used Occam) select on input, not output. I believe that >>>>> restriction was due to the difficulty of implementing bidirectional >>>>> select between actual distributed hardware processors, but I'm sure >>>>> Øyvind knows better. >>>>> >>>>> func main() { >>>>> c1, c2, c3 := make(chan int), make(chan int), make(chan int) >>>>> >>>>> go func() { >>>>> pri select { >>>>> case c1 <- 1: >>>>> case v := <-c2: >>>>> c3 <- v >>>>> } >>>>> }() >>>>> go func() { >>>>> pri select { >>>>> case c2 <- 2: >>>>> case v := <-c1: >>>>> c3 <- v >>>>> } >>>>> }() >>>>> fmt.Println(<-c3) >>>>> } >>>> >>>> Interesting case. I would argue, though, that there is no happens-before >>>> edge here to order the cases and I was only considering providing a >>>> guarantee if there is one. >>>> >>>> That said, I suspect that the semantics could be ironed out, and the real >>>> reason for Go's lack is that it's not actually that useful; that it would >>>> be one more feature; and that in practice a random choice makes sense >>>> almost all the time. >>> >>> As I said, this would certainly satisfy me as an answer :) >>> >>>> >>>> >>>>>> On Thu, May 6, 2021 at 3:40 PM Axel Wagner >>>>>> <axel.wagner...@googlemail.com> wrote: >>>>>> FWIW after all this discussion I *am* curious about a more detailed >>>>>> argument for why we can't have a priority select that guarantees that if >>>>>> the high-priority case becomes ready before the low-priority one (in the >>>>>> sense of "there exists a happens-before edge according to the memory >>>>>> model"), the high-priority will always be chosen. >>>>>> >>>>>> That is, in the example I posted above, we do know that `hi` becoming >>>>>> readable happens-before `lo` becoming readable, so a true prioritized >>>>>> select would always choose `hi` and never return. The construct we >>>>>> presented does return. >>>>>> >>>>>> Now, I do 100% agree that it's not possible to have a select that >>>>>> guarantees that `hi` will be read if both become readable concurrently. >>>>>> But I don't see a fundamental issue with having a select that always >>>>>> chooses `hi` if `hi` becoming readable happens-before `lo` becoming >>>>>> readable. >>>>>> >>>>>> And to be clear, I also kinda like that we don't have that - I think the >>>>>> value provided by the pseudo-random choice in preventing starvation is >>>>>> worth not having an "ideal" priority select construct in the language. >>>>>> But I couldn't really make a good case why we can't have it. >>>>> >>>>> -- >>>>> 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/CAEkBMfEJNtu1i1RyZxW5FNYkD0TB73nq0WyVCCW_E9_JOAVJmw%40mail.gmail.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/CAEkBMfHEEDdL8adBDFoqwVHswK3kr_KawePGi%3DNtbaBVTP5KWw%40mail.gmail.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/CAEkBMfHv2cKR1OLS97YN7JYKZXHu_s0a-6c0-2tW%3DS0gUU8jUA%40mail.gmail.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/43E1CCE1-CD8A-4FCA-B3CB-2CF44E29B3FD%40ix.netcom.com.