如何检测死锁?

问题描述 投票:3回答:3

我正在编写一个计算所有友好和完美数字的程序。

可悲的是我的代码有问题!

如果有人知道在计算完所有数字后如何停止程序,最好没有错误,请告诉我。

package main

import (
    "fmt"
    "strings"
)

func getDivisorSum(number int) int {
    divisors := 0

    for possibleDivisor := 1; possibleDivisor <= number / 2; possibleDivisor++ {
        if number % possibleDivisor == 0 {
            divisors += possibleDivisor
        }
    }

    return divisors
}

func checkNumber(number int, channel chan string, done *int) {
    first := getDivisorSum(number)

    if first == number {
        channel <- fmt.Sprintf("%d", number)
        *done += 1
        return
    }

    second := getDivisorSum(first)

    if number == second {
        channel <- fmt.Sprintf("%d:%d", number, first)
        *done += 1
        return
    }
}

func checkNumberRange(min int, max int) {
    channel := make(chan string)
    done := 0

    for number := min; number <= max; number++ {
        go checkNumber(number, channel, &done)
    }

    for {
        tmp := <- channel

        if strings.Contains(tmp, ":") {
            parts := strings.Split(tmp, ":")
            fmt.Printf("%s is an amicable of %s!\n", parts[0], parts[1])
        } else {
            fmt.Printf("%s is perfect!\n", tmp)
        }
    }
}

func main() {
    checkNumberRange(1, 65536)
}

此刻,程序死于死锁,位于>]

tmp := <- channel

谢谢你,Jooarye!

我正在编写一个计算所有友好和完美数字的程序。可悲的是我的代码有问题!如果有人知道在计算完所有数字后如何停止程序,...

go deadlock
3个回答
5
投票

您的程序有多个问题:


0
投票

从通道读取将被阻止,直到有数据为止。您可以检查第二个返回值以断言通道是否已关闭。


0
投票

我建议您阅读以下文章https://blog.golang.org/pipelines

© www.soinside.com 2019 - 2024. All rights reserved.