torsdag 6. mai 2021 kl. 21:41:11 UTC+2 skrev ren...@ix.netcom.com:

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

For a [0] dim unbuffered chan there should be no need for any buffer, 
unless (as you say, there is some network in between). Basically a channel 
consists of which task was "first" on it, what it wants to do and a pointer 
to the data and the len, when the first part is descheduled until after the 
second part on the channel is ready, the action is done (a *memcpy* in the 
correct direction, from local data inside one task to local data in the 
other task, this is 100% safe and there is no need for semaphores etc. to 
protect anything) and the first part is set to become rescheduled. This 
means that a synchronous unbufferd channel has no buffer and no queue for 
the data. And as Rob Pike said "Now for those experts in the room who know 
about *buffered channels* in Go – which exist – you can create a channel 
with a buffer. And buffered channels have the property that they don’t 
synchronize when you send, because you can just drop a value in the buffer 
and keep going. So they have different properties. And they’re kind of 
subtle. They’re very useful for certain problems, but *you don’t need them*. 
And we’re not going to use them at all in our examples today, because I 
don’t want to complicate life by explaining them.” 
(https://www.youtube.com/watch?v=f6kdp27TYZs)

Øyvind
 

>
> On May 6, 2021, at 1:30 PM, 'Axel Wagner' via golang-nuts <
> golan...@googlegroups.com> wrote:
>
> 
>
> On Thu, May 6, 2021 at 8:22 PM Robert Engels <ren...@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 <
>> golan...@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 <ren...@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 <
>>> golan...@googlegroups.com> wrote:
>>>
>>> 
>>>
>>>
>>> On Thu, May 6, 2021 at 4:43 PM roger peppe <rogp...@gmail.com> wrote:
>>>
>>>>
>>>> On Thu, 6 May 2021 at 14:41, 'Axel Wagner' via golang-nuts <
>>>> golan...@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.wa...@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 
>>>>>> <https://play.golang.org/p/UUA7nRFdyJE>, 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...@googlegroups.com.
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/golang-nuts/CAEkBMfEJNtu1i1RyZxW5FNYkD0TB73nq0WyVCCW_E9_JOAVJmw%40mail.gmail.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/golang-nuts/CAEkBMfEJNtu1i1RyZxW5FNYkD0TB73nq0WyVCCW_E9_JOAVJmw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>> -- 
>>> 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...@googlegroups.com.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/golang-nuts/CAEkBMfHEEDdL8adBDFoqwVHswK3kr_KawePGi%3DNtbaBVTP5KWw%40mail.gmail.com
>>>  
>>> <https://groups.google.com/d/msgid/golang-nuts/CAEkBMfHEEDdL8adBDFoqwVHswK3kr_KawePGi%3DNtbaBVTP5KWw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>> -- 
>> 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...@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
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/CAEkBMfHv2cKR1OLS97YN7JYKZXHu_s0a-6c0-2tW%3DS0gUU8jUA%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
>> -- 
> 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...@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
>  
> <https://groups.google.com/d/msgid/golang-nuts/CAEkBMfHQq2p60OenLMYUFz%3DK9HigpbAqj7m%3D%2BRp7BnCX%2Bp1QLA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
>

-- 
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/11e7d795-d2b7-416c-b860-6fa650d2d5f9n%40googlegroups.com.

Reply via email to