使用带有sync.WaitGroup的goroutine结果不一致

使用带有sync.waitgroup的goroutine结果不一致

在Go语言中,使用goroutine可以实现并发执行任务,而sync.WaitGroup则是一种同步机制,用于等待一组goroutine的完成。然而,php小编香蕉发现,在某些情况下,使用带有sync.WaitGroup的goroutine可能会导致结果不一致的问题。这种问题通常发生在多个goroutine同时修改共享变量的情况下,由于goroutine的执行顺序不确定,可能会导致最终结果的不一致性。在本文中,我们将探讨这个问题的原因,并提供一些解决方案来确保goroutine之间的结果一致性。

问题内容

我正在尝试使用 goroutine(在 Go lang 中)计算小于任意整数 i 的素数数量。例如,如果 i 为 100,则结果应为 25。

以下是我当前的实现:

package "main"import (    "fmt"    "math"    "sync"    "time")var wg sync.WaitGroupfunc isprime(x int) bool {    if x == 2 {        return true    }    if x == 1 || x%2 == 0 {        return false    }    var xi = float64(x)    for i := 3; float64(i) 

当我运行这个程序时,我得到了较小的 i 值的正确结果(直到大约 1000)

但是对于较大的 i 值,结果不一致并且不正确。

❯ ./mainTill what number should I count primes? 10000Counting primes till  10000Counted 1228 primestook 0.006776541 seconds❯ ./mainTill what number should I count primes? 10000Counting primes till  10000Counted 1227 primestook 0.004183875 seconds❯ ./mainTill what number should I count primes? 1000000Counting primes till  1000000Counted 78254 primestook 0.441985921 seconds❯ ./mainTill what number should I count primes? 1000000Counting primes till  1000000Counted 78327 primestook 0.430042047 seconds

登录后复制

随着 i 的值变大,结果波动增大。是什么原因造成的?有什么方法可以使其一致且正确吗?

解决方法

您有一个共享变量,但没有适当的同步。存在竞争条件(*pr += 1)。在共享变量前后添加互斥体修复它(mu.Lock()、mu.Unlock())。

代码:

var wg sync.WaitGroupvar mu sync.Mutexfunc main() {    fmt.Print("Till what number should I count primes? ")    var i int    fmt.Scan(&i)    r := 0    pr := &r    fmt.Println("Counting primes till ", i)    start := time.Now()    for x := 0; x 

输出:

Till what number should I count primes? 1000000Counting primes till  1000000Counted 78498 primestook 0.6783484 secondsTill what number should I count primes? 1000000Counting primes till  1000000Counted 78498 primestook 0.5428273 secondsTill what number should I count primes? 1000000Counting primes till  1000000Counted 78498 primestook 0.5521617 seconds

登录后复制

以上就是使用带有sync.WaitGroup的goroutine结果不一致的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2484655.html

(0)
上一篇 2025年3月4日 21:36:31
下一篇 2025年2月22日 21:07:06

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论