Nebenläufigkeit in go: Sind channels an Goroutinen "gebunden"?

Folgender Ansatz zur Lösung des (ersten) Leser-Schreiber-Problems:

package rw

/* (c) Christian Maurer v. 6. Juli 2011
dr-maurer.eu proprietary - all rights reserved */

/* >>> Problem / Question:

Is it legitimate, to use *one* channel
for all readers or writers resp. ?

More abstract:
Given goroutines C1, C2, ... Cn and S,
is it possible to use *one* channel
to send messages from the Ci to S,
or are channels bound to two goroutines,
i.e. every Ci has to use an *own* channel ? */

var
readerIn, readerOut,
writerIn, writerOut,
quit chan int

func server () {
nReaders, nWriters:= 0, 0
for {
if _, ok:= <-quit; ok {
break
}
if nWriters == 0 {
if nReaders == 0 {
select { case <-readerIn:
nReaders++
case <-writerIn:
nWriters = 1
default:
}
} else { // nReaders > 0
select { case <-readerIn:
nReaders++
case <-readerOut:
nReaders--
default:
nReaders--
}
}
} else { // nWriters == 1
select { case <-writerOut:
nWriters = 0
default:
}
}
}
}

func ReaderIn () {
readerIn <- 0
}

func ReaderOut () {
readerOut <- 0
}

func WriterIn () {
writerIn <- 0
}

func WriterOut () {
writerOut <- 0
}

func Terminate () {
quit <- 0
}

func init () {
readerIn = make (chan int)
readerOut = make (chan int)
writerIn = make (chan int)
writerOut = make (chan int)
quit = make (chan int)
}

Die Frage dazu ist oben im Kommentar zum Quelltext gestellt
(dazu habe ich bisher keine Aussage in der Spezifikation von go gefunden).

Wenn das *so* nicht geht, werde ich den go-Entwicklern vorschlagen,
eine Konstruktion "select { for i:= 0; i<...; i++ {case <-ch[i] ...
(so wie in Pascal-FC von Burns & Davies).

Mit besten Grüßen,

Ch. Maurer

P.S. Ein herzliches Dankeschön an die Autoren des Buchs -
es war beim Lernen von Go wirklich *sehr* hilfreich!

Neueste Kommentare

Drupal Theme by proxiss GmbH, mini icons by brandspankingnew.