KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
In his answer to this question: Golang for Windows erratic behavior? user @distributed recommended to lock/synchronize access to a shared variable on concurrent goroutines. How can I do that? More on the issue: I get this code (the returned function with a closure on views ) running on several goroutines at the same time: func makeHomeHandler() func(c *http.Conn, r *http.Request) { views := 1 return func(c *http.Conn, r *http.Request) { fmt.Fprintf(c, "Counting %s, %d so far.", r.URL.Path[1:], views) views++ } } It looks like the IO function takes it's time, and as a result I get this kind of output: Counting monkeys, 5 so far. Counting monkeys, 5 so far. Counting monkeys, 5 so far. Counting monkeys, 8 so far. Counting monkeys, 8 so far. Counting monkeys, 8 so far. Counting monkeys, 11 so far. It increments fine, but when it gets printed I can see that the operation printing+incrementing is not atomic at all. If I change it to: func makeHomeHandler() func(c *http.Conn, r *http.Request) { views := 0 return func(c *http.Conn, r *http.Request) { views++ // I can only hope that other goroutine does not increment the counter // at this point, i.e., right after the previous line and before the // next one are executed! views_now := views fmt.Fprintf(c, "Counting %s, %d so far.", r.URL.Path[1:], views_now) } } It seems to work fine, but I'm not completely sure if it will not fail eventually...
Tags (comma-separated)
Save Edits
Cancel