torsdag 6. mai 2021 kl. 16:44:08 UTC+2 skrev rog:

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

Without the assumed pri select the above it is the same 
as https://en.wikipedia.org/wiki/Promela#Executability. I have stared a lot 
on that one almost not believing my eyes when it didn't deadlock. The text 
emphasises that there are "non-deterministic choices" but I don't think we 
foresaw any pri choice. (I got some help from Holzmann to do some of the 
text in that chapter). I assume you would say a pri select there would 
cause a deadlock? It probably would, yes.

Øyvind
 

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

>
> 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+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/2b0853b1-c83c-4d55-9b88-bfe0b661ec41n%40googlegroups.com.

Reply via email to