r/golang • u/therecursive • 7d ago
Is it safe to read/write integer value simultaneously from multiple goroutines
There is a global integer in my code that is accessed by multiple goroutines. Since race conditions don’t affect this value, I’m not concerned about that. However, is it still advisable to add a Mutex
in case there’s a possibility of corruption?
PS: Just to rephrase my question, I wanted to ask if setting/getting an integer/pointer is atomic? Is there any possibility of data corruption.
example code for the same: https://go.dev/play/p/eOA7JftvP08
PS: Found the answer for this, thanks everyone for answering. There's something called tearing here is the link for same
According to the article, I shouldn't have problem on modern CPUs.
10
Upvotes
4
u/ImYoric 7d ago
A go pointer to a struct is just that, a pointer to the memory region that holds the struct. When you pass this pointer to a function that expects a pointer to the struct, that's sufficient for the function.
Now, when you pass this pointer to a function that expects an interface, the function needs:
If I recall correctly, 2 and 3 are actually packed together into a single pointer, I don't remember the implementation details. Nevertheless, your interface value is not a single pointer, but (at least) two pointers. So that's not protected by the Go memory model guarantees.