I don’t think the analysis by alphadose in the issue you cite is correct. Go 
added async pre-emption (via signals) and I believe it can preempt a Go thread 
anywhere but in an internal critical section. Ian would know for sure. It is 
certainly not only at a function call boundary because that would cause the 
“infinite spin loop blocking GC” issue. Once a routine is preempted any 
available routine could run on the same processor/OS thread.

> On Dec 5, 2022, at 5:20 PM, Andrew Athan <andrew...@gmail.com> wrote:
> 
> In brief then, in the presence of os threads running on a kernel that can 
> preempt threads, it is incorrect to assume that any two statements within a 
> goroutine will run atomically (both run, or not at all), irrespective of the 
> simplicity of those statements, or whether any function calls involved are 
> inlined, etc...
> 
> On Monday, December 5, 2022 at 3:18:09 PM UTC-8 Andrew Athan wrote:
> The statement I made is actually a bit stronger than the one you confirmed: 
> Even if the goroutines are using atomic load/store, the preemtive nature of 
> the os threads could easily interrupt one goroutine between an atomic load 
> and its use of that value, giving another goroutine the opportunity to change 
> the stored value at the atomic load location, potentially leading to a data 
> race -- particularly when the loader is storing to a related but different 
> location and/or without a CAS on the original loaded value.
> 
> To answer your question, no ... within the go runtime, I DO NOT claim to have 
> found instances of that kind of load/check/store as separate operations 
> within a function such that those operations are assumed to run atomically.
> 
> However, I've run into a couple of such instances in public repos. Thus, I 
> wanted to confirm my thinking. For example, I initiated a discussion about 
> same here:
> 
> https://github.com/alphadose/haxmap/issues/26 
> <https://github.com/alphadose/haxmap/issues/26>
> 
> (I ran across haxmap while reviewing issues in the golang repo relative to 
> sync.Map)
> 
> On Monday, December 5, 2022 at 10:45:10 AM UTC-8 Ian Lance Taylor wrote:
> On Mon, Dec 5, 2022 at 10:03 AM Andrew Athan <andr...@gmail.com <>> wrote: 
> > 
> > I'm having trouble finding definitive information about golang's preemption 
> > model when running with GOMAXPROCS>1 on a multi-core Intel with preemtive 
> > linux kernel. 
> > 
> > As I understand it, in such a scenario, two goroutines may be scheduled by 
> > the go runtime onto two separate system threads on two separate CPUs. 
> > 
> > Isn't it true then, that irrespective of whether the two goroutines are 
> > scheduled onto separate CPUs, the OS may preemptively interrupt either of 
> > those goroutines to let the other run? Also, that if they are indeed 
> > scheduled onto separate CPUs, that the memory accesses made by those 
> > goroutines are interleaved even if no individual goroutine is "preempted"? 
> > 
> > I'm asking because in reviewing the code of some "lock free" concurrent 
> > data structures written in go, it appears the authors have made certain 
> > assumptions about race conditions (e.g., the code of on goroutine assumes 
> > that another goroutine won't perform a load/store between two function 
> > calls the first goroutine makes to check a boolean and store a value). 
> > 
> > Given that goroutines are mappes onto system threads, and that in a 
> > preemptive kernel those threads may be preempted and/or irrespective of the 
> > preemptive kernel issue may run on separate cores, no assumptions should be 
> > made about the "atomicity" of multiple statements in a goroutine relative 
> > to other goroutines. Right? 
> > 
> > Where can I get the most current and accurate information about this topic? 
> 
> I'm not aware of any detailed documentation of the issues you are 
> looking at. So the most current and accurate information is the 
> source code. Or this mailing list. 
> 
> You are correct that non-atomic memory operations made by different 
> goroutines can be freely interleaved. If there is any code in the 
> runtime that assumes otherwise, that code is badly broken. If you can 
> point to the specific code that you are concerned about, perhaps we 
> can allay your concerns, or perhaps we can fix the bug. Thanks. 
> 
> Ian 
> 
> -- 
> 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 
> <mailto:golang-nuts+unsubscr...@googlegroups.com>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/0b44c5d7-7c45-4392-9046-eb56f8830a52n%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/0b44c5d7-7c45-4392-9046-eb56f8830a52n%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- 
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/4EB029F3-E42E-4E4B-A5F8-4E000765ACA5%40ix.netcom.com.

Reply via email to