Maison > développement back-end > Golang > le corps du texte

Pourquoi la routine go se comporte-t-elle ainsi ?

WBOY
Libérer: 2024-02-08 23:30:10
avant
731 Les gens l'ont consulté

为什么 go 例程会有这样的行为?

l'éditeur php Xigua répondra à votre question sur "la raison du comportement de routine". La routine (goroutine) dans le langage Go est un mécanisme de concurrence léger qui peut obtenir l'effet d'une exécution simultanée. Cependant, dans certains cas, le comportement des routines go peut avoir des résultats inattendus. Cela est principalement dû au mécanisme de planification des routines go et aux caractéristiques du modèle de mémoire. Avant de comprendre en profondeur le comportement de routine du langage Go, nous devons comprendre ces fonctionnalités et leur impact sur le comportement du programme.

Contenu de la question

Je lis un livre intitulé "Go in action" et je suis un peu confus au sujet de la partie goroutine du livre, en gros je veux savoir deux choses sur le code suivant :

package main

import (
    "fmt"
    "runtime"
    "sync"
    "time"
)

var counter int = 0
var wg sync.WaitGroup
var mtx sync.Mutex

func main() {
    wg.Add(2)

    runtime.GOMAXPROCS(1)

    go incCounter("A")
    go incCounter("B")

    wg.Wait()
    fmt.Println(counter)
}

func incCounter(prefix string) {
    fmt.Println("Started thread ", prefix)
    defer wg.Done()
    mtx.Lock()
    {
        fmt.Println("Incrementing counter from ", prefix)
        counter = counter + 1
        fmt.Println("Passing to another thread")
        runtime.Gosched()
        for i := 1; i < 100; i++ {
            time.Sleep(1 * time.Second)
            fmt.Println("Thread still executing ", prefix)
        }
    }
    mtx.Unlock()
}
Copier après la connexion

Le résultat est :

Started thread  B
Incrementing counter from  B
Passing to another thread
Started thread  A
Thread still executing  B
Thread still executing  B
Thread still executing  B
Thread still executing  B
Copier après la connexion
  1. Pourquoi exécute-t-il la goroutine B en premier ? Parce que dans le code, la goroutine A vient en premier, je veux qu'elle s'exécute également en premier.
  2. goroutine B utilise la méthode .Gosched pour laisser la goroutine A commencer à s'exécuter, mais comme le mutex est verrouillé, la goroutine A attendra qu'elle soit déverrouillée. À l'heure actuelle, j'ai configuré GOMAXPROCS pour qu'il n'ait qu'un seul processeur logique. Pourquoi semble-t-il que les deux goroutines fonctionnent en parallèle ? Cela devrait-il vraiment arriver ?

Comme je l'ai dit, définir gomaxprox sur 1 permettrait à un seul Goroutine de s'exécuter à la fois, mais dans ce cas, cela ne semble pas être le cas, en fait les deux Goroutines fonctionnent en parallèle.

Solution

Les Goroutines s'exécutent simultanément. Cela signifie que si des processeurs sont disponibles, le planificateur peut planifier leur exécution en parallèle. Si un seul processeur est disponible, ils fonctionneront toujours simultanément, mais un seul goroutine sera exécuté à un moment donné.

Le runtime Go ne garantit pas quelle goroutine s'exécutera en premier. L'ordre de passage d'un ensemble de goroutines nouvellement créées est donc aléatoire,

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!