But that is not really true because there are no constraints on if the source 
channels are buffered - if they are then my code operates similarly. 

Even if using unbuffered channels there is buffering being done at a lower 
level (hardware buffers, network stack buffers, etc) - so not “unblocking a 
sender” is a dubious endeavor. 

> On May 6, 2021, at 1:30 PM, 'Axel Wagner' via golang-nuts 
> <golang-nuts@googlegroups.com> wrote:
> 
> 
>> On Thu, May 6, 2021 at 8:22 PM Robert Engels <reng...@ix.netcom.com> wrote:
> 
>> “If lo” means that if the lo channel was read. 
> 
> Exactly. To fulfill the requirements and answering the question, it must not 
> be 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. 
> 
> What the receiver does with the value is immaterial. Point is, that the 
> receiver has already read the value, thus the communication has happened, 
> thus the sender was unblocked. The question is about a select that wouldn't 
> do that.
>  
>> Btw using indents rather than brackets in the above - maybe that is causing 
>> the confusion. 
> 
> I'm not confused. Your code is simply not answering the question posed. Which 
> is about a select which always lets the high priority communication happen, 
> if it is ready before the low priority communication - and consequently 
> *doesn't* let the low priority communication happen.
>  
>>       
>> 
>> 
>>>> 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/CAEkBMfHQq2p60OenLMYUFz%3DK9HigpbAqj7m%3D%2BRp7BnCX%2Bp1QLA%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/C2214C2E-8D44-409A-8E29-4665E941E86C%40ix.netcom.com.

Reply via email to