Table des matières
Bonne réponse
Maison développement back-end Golang Les Goroutines semblent interrompues malgré l'existence de WaitGroup

Les Goroutines semblent interrompues malgré l'existence de WaitGroup

Feb 06, 2024 am 09:06 AM
arrangement

尽管存在 WaitGroup,Goroutines 似乎还是被中断了

Contenu de la question

J'ai un problème avec la goroutine qui ne se termine pas malgré l'existence du groupe d'attente. Dans le code ci-joint, vous pouvez voir l'implémentation de l'algorithme de permutation de tas. Je voulais accélérer les choses, j'ai donc créé une goroutine pour chaque premier numéro possible, réduisant ainsi les permutations de chaque goroutine à (n-1)!。总的来说,我应该仍然有 n! 排列 (n*(n-1)!= n!),但我的主例程似乎在子例程完成之前退出。然后我尝试跟踪执行的排列。与我的信念相反,执行的排列数量不是恒定的,但在 n! 下总是有点(对于低 n)或非常多(对于大 n).

Par exemple n=4 每次的排列都是 24,即 4! ,这样所有的 goroutine 就结束了。如果我有一个更高的数字,例如 n=8,我会得到一个大约 13500 的值,而不是预期的 40000 = 8!.

D'où vient ce comportement ? Comment s'assurer que toutes les goroutines sont terminées avant la fin du programme principal ?

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup
var permutations int

func main() {

    n := 9

    wg.Add(n)

    for i := 0; i < n; i++ {

        var arr []int
        for j := 0; j < n; j++ {
            if i != j {
                arr = append(arr, j+1)
            }
        }
        go threadFunction(n-1, i+1, arr)
    }

    wg.Wait()

    fmt.Println(permutations)
}

func threadFunction(k int, suffix int, arr []int) {

    defer wg.Done()

    heapPermutation(k, suffix, arr)
}

func heapPermutation(k int, prefix int, arr []int) {

    if k == 1 {
        arr = append(arr, prefix)
        // fmt.Println(arr)
        permutations++
    } else {
        heapPermutation(k-1, prefix, arr)

        for i := 0; i < k-1; i++ {
            if k%2 == 0 {
                arr[i], arr[k-1] = arr[k-1], arr[i]
            } else {
                arr[0], arr[k-1] = arr[k-1], arr[0]
            }
            heapPermutation(k-1, prefix, arr)
        }
    }
}
Copier après la connexion

(Le même comportement peut être facilement obtenu, par exemple sur https://go.dev/play/, donc c'est très reproductible.)


Bonne réponse


Dans votre code, goroutine accède simultanément aux valeurs de permutations 变量。当您增加 n , la charge de travail augmente, ce qui peut devenir un problème entraînant des résultats inattendus.

Vous pouvez utiliser mutex,它将确保当时只有一个goroutine可以访问permutations.

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup
var permutations int
var permutationsMutex sync.Mutex

func main() {

    n := 9

    wg.Add(n)

    for i := 0; i < n; i++ {

        var arr []int
        for j := 0; j < n; j++ {
            if i != j {
                arr = append(arr, j+1)
            }
        }
        go threadFunction(n-1, i+1, arr)
    }

    wg.Wait()

    fmt.Println(permutations)
}

func threadFunction(k int, suffix int, arr []int) {

    defer wg.Done()

    heapPermutation(k, suffix, arr)
}

func heapPermutation(k int, prefix int, arr []int) {

    if k == 1 {
        arr = append(arr, prefix)
        permutationsMutex.Lock()
        permutations++
        permutationsMutex.Unlock()
    } else {
        heapPermutation(k-1, prefix, arr)

        for i := 0; i < k-1; i++ {
            if k%2 == 0 {
                arr[i], arr[k-1] = arr[k-1], arr[i]
            } else {
                arr[0], arr[k-1] = arr[k-1], arr[0]
            }
            heapPermutation(k-1, prefix, arr)
        }
    }
}
Copier après la connexion

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles sont les dix principales plateformes de trading de devises virtuelles? Quelles sont les dix principales plateformes de trading de devises virtuelles? Feb 20, 2025 pm 02:15 PM

Avec la popularité des crypto-monnaies, des plateformes de trading de devises virtuelles ont émergé. Les dix principales plateformes de trading de devises virtuelles au monde sont classées comme suit selon le volume des transactions et la part de marché: Binance, Coinbase, FTX, Kucoin, Crypto.com, Kraken, Huobi, Gate.io, Bitfinex, Gemini. Ces plateformes offrent un large éventail de services, allant d'un large éventail de choix de crypto-monnaie à la négociation des dérivés, adapté aux commerçants de niveaux différents.

Comment ajuster l'échange ouvert en sésame en chinois Comment ajuster l'échange ouvert en sésame en chinois Mar 04, 2025 pm 11:51 PM

Comment ajuster l'échange ouvert en sésame en chinois? Ce didacticiel couvre des étapes détaillées sur les ordinateurs et les téléphones mobiles Android, de la préparation préliminaire aux processus opérationnels, puis à la résolution de problèmes communs, vous aidant à changer facilement l'interface d'échange Open Sesame aux chinois et à démarrer rapidement avec la plate-forme de trading.

Dois-je utiliser Flexbox au centre de l'image bootstrap? Dois-je utiliser Flexbox au centre de l'image bootstrap? Apr 07, 2025 am 09:06 AM

Il existe de nombreuses façons de centrer des photos de bootstrap, et vous n'avez pas à utiliser Flexbox. Si vous avez seulement besoin de centrer horizontalement, la classe de cent texte est suffisante; Si vous devez centrer verticalement ou plusieurs éléments, Flexbox ou Grid convient plus. Flexbox est moins compatible et peut augmenter la complexité, tandis que Grid est plus puissant et a un coût d'enseignement supérieur. Lorsque vous choisissez une méthode, vous devez peser les avantages et les inconvénients et choisir la méthode la plus appropriée en fonction de vos besoins et préférences.

Comment calculer C-SUBScript 3 Indice 5 C-SUBScript 3 Indice Indice 5 Tutoriel d'algorithme Comment calculer C-SUBScript 3 Indice 5 C-SUBScript 3 Indice Indice 5 Tutoriel d'algorithme Apr 03, 2025 pm 10:33 PM

Le calcul de C35 est essentiellement des mathématiques combinatoires, représentant le nombre de combinaisons sélectionnées parmi 3 des 5 éléments. La formule de calcul est C53 = 5! / (3! * 2!), Qui peut être directement calculé par des boucles pour améliorer l'efficacité et éviter le débordement. De plus, la compréhension de la nature des combinaisons et la maîtrise des méthodes de calcul efficaces est cruciale pour résoudre de nombreux problèmes dans les domaines des statistiques de probabilité, de la cryptographie, de la conception d'algorithmes, etc.

Top 10 des plates-formes de trading de devises virtuelles 2025 Applications de trading de crypto-monnaie classée top dix Top 10 des plates-formes de trading de devises virtuelles 2025 Applications de trading de crypto-monnaie classée top dix Mar 17, 2025 pm 05:54 PM

Top dix plates-formes de trading de devises virtuelles 2025: 1. Okx, 2. Binance, 3. Gate.io, 4. Kraken, 5. Huobi, 6. Coinbase, 7. Kucoin, 8. Crypto.com, 9. BitFinex, 10. Gemini. La sécurité, la liquidité, les frais de traitement, la sélection des devises, l'interface utilisateur et le support client doivent être pris en compte lors du choix d'une plate-forme.

Top 10 des plates-formes de trading de crypto-monnaie, les dix principales applications de plate-forme de trading de devises recommandées Top 10 des plates-formes de trading de crypto-monnaie, les dix principales applications de plate-forme de trading de devises recommandées Mar 17, 2025 pm 06:03 PM

Les dix principales plates-formes de trading de crypto-monnaie comprennent: 1. Okx, 2. Binance, 3. Gate.io, 4. Kraken, 5. Huobi, 6. Coinbase, 7. Kucoin, 8. Crypto.com, 9. BitFinex, 10. Gemini. La sécurité, la liquidité, les frais de traitement, la sélection des devises, l'interface utilisateur et le support client doivent être pris en compte lors du choix d'une plate-forme.

Quelles sont les plates-formes de monnaie numérique sûres et fiables? Quelles sont les plates-formes de monnaie numérique sûres et fiables? Mar 17, 2025 pm 05:42 PM

Une plate-forme de monnaie numérique sûre et fiable: 1. Okx, 2. Binance, 3. Gate.io, 4. Kraken, 5. Huobi, 6. Coinbase, 7. Kucoin, 8. Crypto.com, 9. Bitfinex, 10. Gemini. La sécurité, la liquidité, les frais de traitement, la sélection des devises, l'interface utilisateur et le support client doivent être pris en compte lors du choix d'une plate-forme.

Fonction de fonction distincte Distance de distance C Tutoriel d'utilisation Fonction de fonction distincte Distance de distance C Tutoriel d'utilisation Apr 03, 2025 pm 10:27 PM

STD :: Unique supprime les éléments en double adjacents dans le conteneur et les déplace jusqu'à la fin, renvoyant un itérateur pointant vers le premier élément en double. STD :: Distance calcule la distance entre deux itérateurs, c'est-à-dire le nombre d'éléments auxquels ils pointent. Ces deux fonctions sont utiles pour optimiser le code et améliorer l'efficacité, mais il y a aussi quelques pièges à prêter attention, tels que: std :: unique traite uniquement des éléments en double adjacents. STD :: La distance est moins efficace lorsqu'il s'agit de transacteurs d'accès non aléatoires. En maîtrisant ces fonctionnalités et les meilleures pratiques, vous pouvez utiliser pleinement la puissance de ces deux fonctions.

See all articles