Sure it has a race issue, because in this example you're mixing atomic 
operations with mutex, when you want your code to be thread safe you need 
to do access to the variable using mutex or using atomic in all cases. 
Because both ways work differently and are not "interchargable" so you 
can't cover access to same object using a mix of 2 ways.

You can fix your code like this:
1a. change m.RLock() to m.Lock()/m.Unlock() near atomic.AddInt32(&n, 1) 
because it's writing operation so you need write mutex
1b. add m.Lock()/m.Unlock near n=0 because it's writing operation as well
The, you can remove atomic ops, because now all the code is covered by 
mutexes

2. Change n=0 to atomic.StoreInt32(&n, 0)
Then you can remove all mutexes, because access is covered by atomic ops





W dniu piątek, 5 lipca 2019 12:40:32 UTC+2 użytkownik White Pure napisał:
>
> Hi, 
>     I wrote some code like below these days, and my colleagues and me are 
> not sure if the code has any concurrent problem.
>     Can someone help to figure out if the code has any race problem?
>     Thanks very much!
>
>     Code:
>
>> package main
>
>
>> import (
>
> "sync"
>
> "sync/atomic"
>
> )
>
>
>> func main() {
>
> var n int32
>
> var m sync.RWMutex
>
> go func() {
>
> for {
>
> atomic.LoadInt32(&n)
>
> }
>
> }()
>
> go func() {
>
> for {
>
> m.RLock()
>
> atomic.AddInt32(&n, 1)
>
> m.RUnlock()
>
> }
>
> }()
>
> go func() {
>
> for {
>
> m.Lock()
>
> n = 0
>
> m.Unlock()
>
> }
>
> }()
>
> // do something to keep goroutines running here
>
> ......
>
> }
>
>
>     Playground link: https://play.golang.org/p/fRa09l3VQob
>     
>
>

-- 
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/ed3e8643-8781-438d-8191-1c60ee7473c5%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to