Почему atomic.Load не вызывается для загрузки gcphase в runtime.GC? - PullRequest
0 голосов
/ 30 сентября 2018

Интересно, почему gcphase не защищено atomic.Load:

n := atomic.Load(&work.cycles)
if gcphase == _GCmark {
    // Wait until sweep termination, mark, and mark
    // termination of cycle N complete.
    gp.schedlink = work.sweepWaiters.head
    work.sweepWaiters.head.set(gp)
    goparkunlock(&work.sweepWaiters.lock, "wait for GC cycle", traceEvGoBlock, 1)
} else {
    // We're in sweep N already.
    unlock(&work.sweepWaiters.lock)
}

Кто-нибудь знает?

1 Ответ

0 голосов
/ 30 сентября 2018

Код выдержки:

func setGCPhase(x uint32) {
    atomic.Store(&gcphase, x)
    writeBarrier.needed = gcphase == _GCmark || gcphase == _GCmarktermination
    writeBarrier.enabled = writeBarrier.needed || writeBarrier.cgo
}

, в то время как gcphase является глобальной переменной, но все записи в gcphase выполняются с помощью вышеуказанной функции.

Во время выполнения было несколько переменныхкоторые не соединены должным образом, но, кажется, у них есть причина для этого и были уверены, что у них был эксклюзивный доступ к нему.

Вот проблема https://github.com/golang/go/issues/21931, поданная примерно так же, издесь https://go -review.googlesource.com / c / go / + / 65210 Разработчики GC обсуждали, как изменить то же самое.

...