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!
- Anmelden oder Registrieren um Kommentare zu schreiben

Neueste Kommentare
vor 7 Wochen 5 Tage
vor 12 Wochen 18 Stunden
vor 8 Wochen 10 Stunden
vor 14 Wochen 16 Stunden
vor 14 Wochen 1 Tag
vor 14 Wochen 3 Tage
vor 14 Wochen 3 Tage
vor 15 Wochen 6 Tage
vor 18 Wochen 6 Tage
vor 19 Wochen 2 Tage