In the previous example we used explicit locking with mutexes to synchronize access to shared state across multiple goroutines. Another option is to use the built-in synchronization features of goroutines and channels to achieve the same result. This channel-based approach aligns with Go’s ideas of sharing memory by communicating and having each piece of data owned by exactly 1 goroutine. |
|
|
|
|
|
In this example our state will be owned by a single
goroutine. This will guarantee that the data is never
corrupted with concurrent access. In order to read or
write that state, other goroutines will send messages
to the owning goroutine and receive corresponding
replies. These |
|
|
|
As before we’ll count how many operations we perform. |
|
The |
|
Here is the goroutine that owns the |
|
This starts 100 goroutines to issue reads to the
state-owning goroutine via the |
|
We start 10 writes as well, using a similar approach. |
|
Let the goroutines work for a second. |
|
Finally, capture and report the op counts. |
|
Running our program shows that the goroutine-based state management example completes about 80,000 total operations. |
|
For this particular case the goroutine-based approach was a bit more involved than the mutex-based one. It might be useful in certain cases though, for example where you have other channels involved or when managing multiple such mutexes would be error-prone. You should use whichever approach feels most natural, especially with respect to understanding the correctness of your program. |
Next example: Sorting.