登录
首页 >  Golang >  Go问答

如何进行限制总和不超过x的原子相加操作?

来源:stackoverflow

时间:2024-02-16 08:06:24 179浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《如何进行限制总和不超过x的原子相加操作?》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我想在纯原子操作中实现下面的 add

var num int
func add(max int) int {
  if num < max {
    num++
  }
  return num
}

我已经尝试过一个版本

func add(max int64) int64 {
    for {
        old := atomic.LoadInt64(&x)
        if old + 1 < max {
            if atomic.CompareAndSwapInt64(&x, old, old+1) {
                return old+1
            }
        } else {
            return old
        }
    }
}

但是,我想可能有一个更好的解决方案,可以减少失败机会并避免死循环


正确答案


这是您的算法的修订版本,带有多个 goroutine 测试。无论有没有 go 竞赛检测器,它都通过了测试。

add.go

package main

import (
    "fmt"
    "runtime"
    "sync"
    "sync/atomic"
)

var x int64 = -42

func add(max int64) int64 {
    for {
        old := atomic.loadint64(&x)
        if old >= max {
            return old
        }
        new := old + 1
        if atomic.compareandswapint64(&x, old, new) {
            return new
        }
    }
}

func main() {
    const max = 123456
    fmt.println("max:", max)
    fmt.println("x:  ", x)
    var wg sync.waitgroup
    procs := runtime.gomaxprocs(0)
    for i := 0; i < procs; i++ {
        wg.add(1)
        go func(max int64) {
            defer wg.done()
            for {
                if add(max) >= max {
                    return
                }
            }
        }(max)
    }
    wg.wait()
    fmt.println("x:  ", x)

}

https://go.dev/play/p/r-qsnyI7tqv

$ go build -race add.go && ./add
max: 123456
x:   -42
x:   123456
$ go build add.go && ./add
max: 123456
x:   -42
x:   123456

到这里,我们也就讲完了《如何进行限制总和不超过x的原子相加操作?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>