>From the POV of not-runtime-code, preemption can happen anywhere.  
Certainly with GOMAXPROCS > 1, there is OS preemption, and Go's default 
goroutine preemption is now potentially preemptive in most parts of 
non-runtime functions.
On Monday, December 5, 2022 at 7:12:54 PM UTC-5 ren...@ix.netcom.com wrote:

> 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 <andr...@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
>>
>> (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...@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/4e8fa6ea-651e-4cf0-89d0-fbc926a10563n%40googlegroups.com.

Reply via email to