Your code is incorrect for Go. You need to use correct concurrent code. It is documented that tight loops that do not involve function calls may not allow GC to occur.
> On Aug 16, 2019, at 1:09 PM, dr.ch.mau...@gmail.com wrote: > > Dear Community and dear Go-developers, > > Meanwhile it is clear why things do not work: > The Go-Scheduler is unable to allow to switch to another goroutine in > busy-waiting-loops - > the only possibility to get around that problem is either to put > "switch-steps" into the source > - either "time.Sleep(1)" or "runtime.Gosched()". > I think that THIS SHOULD BE DOCUMENTED IN THE LANGUAGE SPECIFICATION !!!!! > > (See my book on https://maurer-berlin.eu/nspbuch - in it's 4th edition things > are mentioned.) > > With kind regards, > Christian Maurer > > Am Montag, 30. Oktober 2017 18:30:06 UTC+1 schrieb Christian Maurer: >> >> Dear Go-community, >> >> I noticed a very strange effect by translating the >> mutual exclusion algorithm of E. W. Dijkstra to Go. >> Reference: >> Cooperating Sequential Processes. Technical Report EWD-123, >> Technological University Eindhoven (1965) >> http://www.cs.utexas.edu/users/EWD/ewd01xx/EWD123.PDF) >> >> Inserting or omitting code lines A and B resp. >> changes the behaviour of this program very severely: >> >> With line A and without line B: >> mutual exclusion is not guaranteed, >> with line B and without line A: >> lock does not terminate and >> with both lines: >> the program works as it should. >> >> --- 8< -------------------------------------------- >> package main >> >> import ( >> "math/rand" >> "time" >> ) >> >> const N = 10 // number of goroutines involved >> >> var ( >> turn int >> b, c = make([]int, N+1), make([]int, N+1) >> n = uint(0) >> inCS = make([]bool, N+1) >> s = make([]string, N+1) >> done = make(chan int) >> ) >> >> func chk(i int) { >> for j := 1; j <= N; j++ { >> if j != i && inCS[j] { >> panic("oops") >> } >> } >> } >> >> func lock(i int) { >> b[i] = 0 >> L: >> if turn != i { >> c[i] = 1 >> if b[turn] == 1 { >> turn = i >> goto L >> } >> } >> time.Sleep(1) // A >> c[i] = 0 >> time.Sleep(1) // B >> for j := 1; j <= N; j++ { >> if j != i && c[j] == 0 { >> goto L >> } >> } >> inCS[i] = true >> chk(i) >> } >> >> func unlock(i int) { >> inCS[i] = false >> c[i], b[i] = 1, 1 >> // turn = 0 // does not matter >> } >> >> func v() { >> time.Sleep(time.Duration(1e7 + rand.Int63n(1e7))) >> } >> >> func count(i int) { >> for k := 0; k < 100; k++ { >> lock(i) >> accu := n >> v() >> accu++ >> v() >> n = accu >> v() >> println(s[i], n) >> unlock(i) >> v() >> } >> done <- 0 >> } >> >> func main() { >> s[1] = "" >> for i := 2; i <= N; i++ { >> s[i] = s[i-1] + " " >> } >> for i := 1; i <= N; i++ { >> go count(i) >> } >> for i := 1; i <= N; i++ { >> <-done >> } >> } >> --- >8 -------------------------------------------- >> >> The cause for the "freaking out" of the program without >> those compulsory breaks (of only 1 ns) is absolutely unclear. >> >> Any sort of help is welcome! >> >> Kind regards to everybody, >> >> Christian Maurer >> > > -- > 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/f83856a2-0661-4425-9861-196b83fcf07f%40googlegroups.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/2678AD8A-6D96-4D46-B977-7A78A2CFC12B%40ix.netcom.com.